J'utilise Android DownloadManger System Service pour télécharger certains fichiers de la manière suivante
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));
où mgr
est l'instance de Download Manager, dwnId
est l'ID unique renvoyé. Je m'inscris également pour ACTION_DOWNLOAD_COMPLETE
registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
et dans la méthode onRownive () de onDownloadComplete BroadcastReceiver, j'obtiens l'ID de téléchargement comme
Long dwnId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
Après cela, je demande au gestionnaire de téléchargement l'état du téléchargement
Cursor c = downloadManager.query(new DownloadManager.Query().setFilterById(dwnId)); c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
pour les constantes DownloadManager.STATUS_ *.
Le problème est que je reçois deux fois le même downId (signifie que la méthode onReceive est appelée deux fois), une fois avec le statut DownloadManager.STATUS_SUCCESSFUL et une fois avec le statut DownloadManager.STATUS_FAILED pour le même dwnId. J'émets une demande de téléchargement d'une dizaine de fichiers à la fois et mais sur le gestionnaire de téléchargement de l'appareil, le nombre de téléchargements s'affiche comme 12 ou 13 dans la barre de notification en haut à gauche. Je pense que le gestionnaire de téléchargement a un problème de téléchargement de fichiers et a repris ou redémarré automatiquement pour télécharger à nouveau le même fichier. C'est pourquoi il y a une différence entre le nombre de fichiers que j'ai demandé de télécharger et le nombre réel dans la file d'attente de téléchargement. Pour cette raison seulement, je reçois la même action complète de DownloadId deux fois. Si cela est vrai, comment le restreindre. Ai-je tort quelle pourrait être la raison de la différence de nombre entre ce que j'ai demandé pour le téléchargement réel? Pourquoi le récepteur de diffusion reçoit-il deux fois le même identifiant de téléchargement? Quelqu'un peut-il me le faire savoir?
Merci d'avance...
Il s'agit d'un bug signalé, voir: http://code.google.com/p/Android/issues/detail?id=18462
Le chemin que j'ai trouvé consiste à vérifier si le téléchargement a été un succès, sinon à abandonner l'intention ou à remettre en file d'attente le fichier s'il n'a jamais été téléchargé ...
Perdu quelques heures en pensant que celui-ci :(
** Modifier: ajout d'un exemple de code **
/**
* 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;
}
Pour le code complet, voir: https://github.com/flegare/JAV387_LaboWidget/blob/master/src/com/mobidroid/widgetfact/service/FactService.Java
Un moyen simple de télécharger vos fichiers, consultez la progression du téléchargement dans la barre de notification et même ouvrez votre fichier lorsqu'il est terminé pour le télécharger en cliquant simplement dessus dans la barre de notification.
Appelez simplement cette méthode et passez votre nom de fichier et téléchargez l'URL
public void downloadFile(String name, String url){
//download link
downloadUri = Uri.parse(url);
DownloadManager.Request request = new DownloadManager.Request(downloadUri);
//allow download to take place over wifi, mobile network and roaming
request.setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE ).setAllowedOverRoaming(true);
request.setAllowedOverRoaming(false);
//name to show while downloading
request.setTitle(name);
//description to show while downloading
request.setDescription("Downloading " + name);
//show on navigation
request.setVisibleInDownloadsUi(true);
//download path
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS.toString(), "/" + name);
//file open when item on navigation is clicked
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
long downloadId = downloadManager.enqueue(request);
}
Production
Vous pouvez en savoir plus ici