web-dev-qa-db-fra.com

DownloadManager.ACTION_DOWNLOAD_COMPLETE récepteur de diffusion recevant plusieurs fois le même identifiant de téléchargement avec différents statuts de téléchargement dans Android

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));

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...

29
Ganesh K

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

35
flegare

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

See the output from image below

Vous pouvez en savoir plus ici

1
Richard Kamere