2012-06-01 16 views
5

Ok, sto scaricando i file (immagini). Voglio inviare un messaggio con URI locale per l'immagine quando il download è completato. Ma il 20% di tempo sto ottenendo questo:DownloadManager invia STATUS_SUCCESSFUL per il download non riuscito

6-01 18:46:39.900: INFO/DownloadManager(412): Initiating request for download 605 
06-01 18:46:39.910: WARN/DownloadManager(412): Aborting request for download 605: Trying to resume a download that can't be resumed 
06-01 18:46:39.910: INFO/ololo(2826): Okay, I'll broadcast. 
06-01 18:46:39.990: WARN/ImageView(2826): Unable to open content: content://downloads/my_downloads/605 
    java.io.FileNotFoundException: No filename found. 
    at android.database.DatabaseUtils.readExceptionWithFileNotFoundExceptionFromParcel(DatabaseUtils.java:145)... 
06-01 18:46:39.990: INFO/System.out(2826): resolveUri failed on bad bitmap uri: content://downloads/my_downloads/605 
06-01 18:46:39.990: INFO/ololo(2826): content://downloads/my_downloads/605 was set for [email protected] 

Ecco il codice

Long downloadId = downloadIds.get(this); 

if(downloadId == intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, -1)) { 
    DownloadManager.Query query = new DownloadManager.Query(); 
    query.setFilterById(downloadId); 
    Cursor cursor = downloadManager.query(query); 

    if(cursor.moveToFirst()) { 

     switch (cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_STATUS))) { 
      case DownloadManager.STATUS_SUCCESSFUL : { 
       Log.i("ololo", "Okay, I'll broadcast."); 
       // Broadcasting 
       break; 
      } 
      case DownloadManager.STATUS_FAILED : { 
       Log.i("ololo", "Bad, I won't broadcast."); 
       int reason = cursor.getInt(cursor.getColumnIndex(DownloadManager.COLUMN_REASON)); 
       if(reason == DownloadManager.ERROR_CANNOT_RESUME || reason == DownloadManager.ERROR_UNKNOWN) { 
        // Rerun download 
       } 
       break; 
      } 
      default: 
       break; 
     } 
    } 
} 
+0

Ciao, sto avendo lo stesso problema. l'hai risolto in qualche modo o capito cosa c'è che non va? –

+0

@TalKanel Il problema sta accadendo SOLO con i dispositivi Samsung (Galaxy Tab 10.1 o qualcos'altro, su 3.2, o 2.3.3 o 4.0 - questo non importa, non è mai successo a nessun HTC). Penso che ci sia il loro _buggy_ realizzazione del 'DownloadManager'. Quindi il mio capo squadra ha scritto la sua realizzazione e funziona bene. – efpies

+0

troppo male, ho bisogno di usarlo nei tablet Samsung P7510 e P5110 (GALAXY TAB 10.1 ONE e TWO), e ho bisogno che funzioni sulle versioni specifiche del sistema operativo che hai citato .. quindi suppongo di dover implementare la mia soluzione. –

risposta

5

DownloadManager è bacato e non funziona correttamente. Questo bug è stato depositato con Google un po 'indietro:

https://code.google.com/p/android/issues/detail?id=18462

Per singolo download del file, si potrebbe risolvere questo specificando una directory unica per scaricare a appositamente per questo scopo, e basta prendere tutto ciò che si ottiene in quella directory su DownloadManager.STATUS_SUCCESSFUL.
Per download di file multipli, al momento non riesco a pensare a una soluzione alternativa, a meno che non si abbia la possibilità di rinominare i file all'origine.

+0

penso che funzionerà nel tuo caso: http://papaya-backend.net/2013/04/12/why-http-etag-header-may-cause-your-downloading-apps-on-android-failed/ – CoDe

+0

Sì, utilizzando HTTP ETags probabilmente risolverebbe questo problema. Tuttavia, l'uso di HTTP ETags è facoltativo nelle specifiche HTTP e, pertanto, l'uso di ETags per risolvere questi problemi dipende dall'avere accesso amministrativo diretto al server Web per aggiungere il supporto ETags. Continuo a sostenere che DownloadManager è bacato perché non funziona senza il supporto di ETags. – Phileo99

+0

Sto affrontando un problema simile ... ottenendo STATUS_FAILED per l'esecuzione del download ... hai idea del perché? – CoDe

Problemi correlati