29

Używam Android DownloadManger usługa systemowa do pobierania niektórych plików w następujący sposóbDownloadManager.ACTION_DOWNLOAD_COMPLETE odbiornik transmisji otrzymaniu sam identyfikator pobierania więcej niż raz z różnymi stanami pobrania w Android

dwnId = mgr.enqueue(new DownloadManager.Request(serveruri) 
     .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | 
       DownloadManager.Request.NETWORK_MOBILE) 
       .setAllowedOverRoaming(false) 
       .setTitle(getAlbumName()) 
       .setDescription(getTrackName()) 
       .setDestinationUri(deviceUri) 
       .setShowRunningNotification(true)); 

gdzie mgr to pobrać instancję Manager, dwnId jest zwracany unikalny identyfikator. Ja również rejestracji na ACTION_DOWNLOAD_COMPLETE

registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE)); 

aw onDownloadComplete BroadcastReceiver za onReceive() Metoda Dostaję pobierania Id jak

Long dwnId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); 

Po tym ja zapytań Menedżer pobierania statusu Pobierz

Cursor c = downloadManager.query(new DownloadManager.Query().setFilterById(dwnId)); c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 

dla stałych DownloadManager.STATUS_ *.

Problem polega na tym, że otrzymuję dwa razy ten sam komunikat downId (oznacza to, że metoda onReceive jest wywoływana dwa razy), jeden raz ze stanem DownloadManager.STATUS_SUCCESSFUL i raz ze stanem DownloadManager.STATUS_FAILED dla tego samego dwnId. Wydaje mi się prośbę o pobranie około 10 plików jednocześnie, ale w menedżerze pobierania urządzeń wyświetla się liczba pobrań, ponieważ około 12 lub 13 w pasku powiadomień oznacza, że ​​górny lewy oznacza. Wydaje mi się, że Menedżer pobierania ma problem z pobieraniem plików i wznawianiem lub ponownym uruchamianiem, aby ponownie pobrać ten sam plik. To dlatego istnieje różnica między liczbą plików, które zażądałem do pobrania, a rzeczywistą liczbą w kolejce pobierania. Z tego powodu tylko dwa razy otrzymuję tę samą akcję doładowania DownloadId. Jeśli to prawda, jak ją ograniczyć. Czy nie mam racji, co może być powodem zliczania różnicy między tym, co żądałem, a rzeczywistym pobieraniem? Dlaczego odbiornik transmisji otrzymuje ten sam identyfikator pobierania dwa razy. Czy ktokolwiek może mi powiedzieć?

z góry dzięki ...

Odpowiedz

33

jest to zgłoszone bug patrz: http://code.google.com/p/android/issues/detail?id=18462

Droga wokół znalazłem to, aby sprawdzić, czy pobieranie okazał się sukcesem, czy nie porzucić zamiar lub ponownie kolejka plik, jeśli nie została pobrana ...

Zgubione kilka godzin na zastanawianie że jeden :(

** Edit: dodawanie przykład kodu **

/** 
* Check if download was valid, see issue 
* http://code.google.com/p/android/issues/detail?id=18462 
* @param long1 
* @return 
*/ 
private boolean validDownload(long downloadId) { 

    Log.d(TAG,"Checking download status for id: " + downloadId); 

    //Verify if download is a success 
    Cursor c= dMgr.query(new DownloadManager.Query().setFilterById(downloadId)); 

    if(c.moveToFirst()){    
     int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS)); 

     if(status == DownloadManager.STATUS_SUCCESSFUL){ 
      return true; //Download is valid, celebrate 
     }else{ 
      int reason = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_REASON)); 
      Log.d(TAG, "Download not correct, status [" + status + "] reason [" + reason + "]");    
      return false; 
     } 
    }    
    return false;         
} 

dla kodu kompletnego Apostolskiej: https://github.com/flegare/JAV387_LaboWidget/blob/master/src/com/mobidroid/widgetfact/service/FactService.java

+0

Thx dla u r wysiłki – vrs

+0

Czy przeszkadza dzielenie kodu? –

+3

@GaurawYadav Pomyślał, że: p, ponieważ nie podzielił się kodem :) –