udidfaker - 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
gestor de descargas android apk (1)
Estoy usando 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 una ID única devuelta. También me estoy registrando para ACTION_DOWNLOAD_COMPLETE
registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
y en el método onReceive () onDownloadComplete BroadcastReceiver estoy obteniendo Id de descarga como
Long dwnId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
Después de eso, consulto el Administrador de descarga para conocer el estado de descarga
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 (el método "media onReceive" se llama dos veces), una vez con el estado DownloadManager.STATUS_SUCCESSFUL y una con el estado DownloadManager.STATUS_FAILED para el mismo dwnId. Estoy emitiendo una solicitud para descargar unos 10 archivos a la vez pero, en el administrador de descargas del dispositivo, se muestra el conteo de descargas como 12 o 13 en la barra de notificaciones superior izquierda. Creo que el administrador de descargas tiene algún problema para descargar archivos y se reanudó o reinició automáticamente para descargar el mismo archivo nuevamente. Es por eso que hay una diferencia entre el número de archivos que solicité descargar y el número real en la cola de descarga. Debido a esto, solo estoy obteniendo la misma acción completa de DownloadId dos veces. Si esto es cierto, cómo restringirlo. ¿Me equivoco cuál podría ser el motivo de la diferencia de conteo entre lo que solicité y la descarga real? ¿Por qué el receptor de difusión recibe la misma Id de descarga dos veces? ¿Alguien puede decirmelo?
Gracias por adelantado...
Este es un error reportado, vea: http://code.google.com/p/android/issues/detail?id=18462
El camino que encontré es verificar si la descarga fue un éxito, si no, abandonar el intento o volver a poner en cola el archivo si nunca fue descargado ...
Perdí un par de horas pensando en eso :(
** Editar: agregar 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 obtener el código completo, consulte: https://github.com/flegare/JAV387_LaboWidget/blob/master/src/com/mobidroid/widgetfact/service/FactService.java