29

Sto usando Android DownloadManger servizio di sistema per il download di alcuni file in modo seguentericevitore di broadcast DownloadManager.ACTION_DOWNLOAD_COMPLETE ricevere stessa scaricare ID più di una volta con diversi stati di download in 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)); 

dove mgr è scaricare esempio Manager, dwnId viene restituito un ID univoco. Sono anche iscrivo a ACTION_DOWNLOAD_COMPLETE

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

e del onDownloadComplete BroadcastReceiver OnReceive() metodo che sto ottenendo scaricare Id come

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

Dopo che sto interrogazione di Download Manager per lo stato di download

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

per costanti DownloadManager.STATUS_ *.

Il problema è che sto ricevendo lo stesso downId due volte (il metodo onReceive viene chiamato due volte), una volta con lo stato DownloadManager.STATUS_SUCCESSFUL e una volta con lo stato DownloadManager.STATUS_FAILED per lo stesso dwnId. Sto emettendo la richiesta di scaricare circa 10 file alla volta e sul gestore dei download del dispositivo mostra il conteggio dei download come 12 o 13 nella barra di notifica in alto a sinistra. Penso che il download manager abbia qualche problema nel download di file e ripreso o riavviato automaticamente per scaricare nuovamente lo stesso file. Ecco perché c'è una differenza tra il numero di file che ho richiesto di scaricare e il numero effettivo nella coda di download. Per questo motivo sto ottenendo solo la stessa azione completa DownloadId due volte. Se questo è vero, come restringerlo. Ho torto quale potrebbe essere la ragione per la differenza di conteggio tra ciò che ho richiesto per il download effettivo? Perché il destinatario della trasmissione riceve lo stesso ID di download due volte. Qualcuno può per favore farmelo sapere?

Grazie in anticipo ...

risposta

33

Si tratta di un bug segnalato vedere: http://code.google.com/p/android/issues/detail?id=18462

Il modo in giro ho trovato è quello di verificare se il download è stato un successo, se non fosso l'intento o ri-coda il file se non è mai stato scaricato ...

perso un paio d'ore per capire che uno :(

** Edit: l'aggiunta di codice di esempio **

/** 
* 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;         
} 

Per vedere codice completo: https://github.com/flegare/JAV387_LaboWidget/blob/master/src/com/mobidroid/widgetfact/service/FactService.java

+0

Thx per u r sforzi – vrs

+0

ti dispiacerebbe condividere codice? –

+3

@GaurawYadav Ha pensato: p perché non ha condiviso il codice :) –

Problemi correlati