2012-06-01 14 views
5

Bien, estoy descargando archivos (imágenes). Deseo enviar un mensaje con un URI local para la imagen cuando se complete la descarga. Pero el 20% del tiempo me estoy haciendo esto:DownloadManager envía STATUS_SUCCESSFUL para la descarga fallida

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] 

Este es el código

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

Hola, estoy teniendo el mismo problema. ¿Lo has resuelto de alguna manera o has entendido lo que está mal? –

+0

@TalKanel El problema está sucediendo SOLO con dispositivos Samsung (Galaxy Tab 10.1 o algo más, en 3.2, o 2.3.3, o 4.0, esto no importa, nunca le pasó a ningún HTC). Creo que existe su propia _buggy_ realización del 'DownloadManager'. Entonces mi jefe de equipo escribió su propia realización y funciona bien. – efpies

+0

es una lástima, tengo que usarlo en las tabletas Samsung P7510 y P5110 (GALAXY TAB 10.1 ONE y DOS), y necesito que funcione en las versiones de SO específicas que mencionaste ... así que supongo que tengo que implementar mi propia solución. –

Respuesta

5

DownloadManager está libre de errores y no funciona correctamente. Este error se presentó con Google hace un tiempo:

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

Para archivo de descarga única, que podría solucionar este especificando un único directorio para descargar a específicamente para este propósito, y acaba de tomar todo lo que se obtiene en ese directorio en DownloadManager.STATUS_SUCCESSFUL.
Para descargas de archivos múltiples, no puedo pensar en una solución alternativa en este momento, a menos que tenga la capacidad de cambiar el nombre de los archivos en la fuente.

+0

Creo que esto funcionará en su caso: http://papaya-backend.net/2013/04/12/why-http-etag-header-may-cause-your-downloading-apps-on-android-failed/ – CoDe

+0

Sí, usar HTTP ETags probablemente resolvería este problema. Sin embargo, el uso de ETags HTTP es opcional en la especificación HTTP, y por lo tanto, usar ETags para resolver este problema depende de tener acceso de administrador directo al servidor web para agregar compatibilidad con ETags. Todavía reclamo que DownloadManager tiene errores porque no funciona sin la compatibilidad con ETags. – Phileo99

+0

Me enfrento a un problema similar ... al obtener STATUS_FAILED para ejecutar la descarga ... ¿tengo alguna idea de por qué? – CoDe

Cuestiones relacionadas