DownloadManager.ACTION_DOWNLOAD_COMPLETE Receptor de difusión que recibe el mismo ID de descarga más de una vez con diferentes estados de descarga en Android
Estoy utilizando Android DownloadManger System Service para descargar algunos archivos de la siguiente manera
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));
Donde mgr
es la instancia de Download Manager, dwnId
es ID único devuelto. También me registro para ACTION_DOWNLOAD_COMPLETE
- DownloadManager VS ¿Implementación de descarga propia?
- ¿Cómo obtener el estado de la descarga?
- podemos abrir la carpeta de descarga a través de. ¿intención?
- Android: descarga el archivo desde Internet mediante DownloadManager y guárdelo en la memoria interna
- ¿Cómo mostrar el progreso de la descarga en la barra de progreso de Android?
registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
Y en el método onReceive () de OnDownloadComplete BroadcastReceiver, estoy recibiendo Id de descarga como
Long dwnId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
Después de que estoy consultando el gestor de descargas para descargar el estado
Cursor c = downloadManager.query(new DownloadManager.Query().setFilterById(dwnId)); c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
Para las constantes DownloadManager.STATUS_ *.
El problema es que estoy recibiendo el mismo downId dos veces (significa que el método onReceive se llama dos veces), una vez con el estado de DownloadManager.STATUS_SUCCESSFUL y una vez con el estado de DownloadManager.STATUS_FAILED para el mismo dwnId. Estoy emitir solicitud para descargar unos 10 archivos a la vez y pero en el gestor de descarga de dispositivos que está mostrando el recuento de descarga como algunos 12 o 13 en la barra de notificación superior izquierda significa. Creo que el gestor de descargas tiene algún problema en la descarga de archivos y se reanuda o se reinicia automáticamente para descargar el mismo archivo de nuevo. Es por eso que hay una diferencia entre el recuento de archivos que pedí descargar y el número real en la cola de descarga. Debido a esto solo estoy recibiendo la misma acción completa de DownloadId dos veces. Si esto es cierto, cómo restringirlo. ¿Me equivoco cuál podría ser la razón de la diferencia de cuenta entre lo que pedí a la descarga real? ¿Por qué el receptor de difusión recibe la misma Id de descarga dos veces. ¿Puede alguien por favor hágamelo saber?
Gracias por adelantado…
- Agregue manualmente archivos locales a la aplicación Descargas
- ¿Por qué este cursor está vacío?
- Notificación desaparece - Android DownloadManager
- Recuperar la ruta de acceso del archivo de la intención de DownloadManager detectada
- Error en el administrador de descargas android
- DownloadManager - entendiendo ERROR_HTTP_DATA_ERROR
- Android DownloadManager "Imposible abrir archivo"
- Establecer carpeta personalizada Android Download Manager
Se trata de un error informado: http://code.google.com/p/android/issues/detail?id=18462
La manera alrededor encontré es comprobar si la transferencia directa era un éxito, si no zanja la intención o vuelve a hacer cola el archivo si nunca fue transferido …
Perdió un par de horas pensando que uno 🙁
** Editar: añadir ejemplo de código **
/** * 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; }
Para ver el código completo, consulte: https://github.com/flegare/JAV387_LaboWidget/blob/master/src/com/mobidroid/widgetfact/service/FactService.java