DownloadManager.ACTION_DOWNLOAD_COMPLETE широковещательный приемник, получающий один и тот же идентификатор загрузки более одного раза с различными статусами загрузки в Android - PullRequest
29 голосов
/ 20 января 2012

Я использую Системную службу Android DownloadManger для загрузки некоторых файлов следующим образом

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 - экземпляр диспетчера загрузки, dwnId - возвращенный уникальный идентификатор.Я также регистрируюсь для ACTION_DOWNLOAD_COMPLETE

registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));

и в методе onDownloadComplete BroadcastReceiver onReceive () я получаю идентификатор загрузки, например

Long dwnId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);

После этого я запрашиваю Download Manager для загрузкистатус

Cursor c = downloadManager.query(new DownloadManager.Query().setFilterById(dwnId)); c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));

для констант DownloadManager.STATUS_ *.

Проблема в том, что я получаю один и тот же downId дважды (значит, метод onReceive вызывается дважды), один раз со статусом DownloadManager.STATUS_SUCCESSFUL и один раз со статусом DownloadManager.STATUS_FAILED для того же dwnId.Я отправляю запрос на загрузку около 10 файлов одновременно, но в диспетчере загрузки устройств он показывает количество загрузок как 12 или 13 в левом верхнем углу панели уведомлений.Я думаю, что менеджер загрузок имеет некоторые проблемы при загрузке файлов и возобновил или автоматически перезапустил, чтобы загрузить тот же файл снова.Вот почему существует разница между количеством файлов, которые я запросил для загрузки, и фактическим количеством в очереди на загрузку.Из-за этого только я получаю одно и то же действие DownloadId дважды.Если это правда, как это ограничить.Я ошибаюсь, что может быть причиной разницы в подсчете между тем, что я запросил для фактической загрузки?Почему приемник вещания получает один и тот же идентификатор загрузки дважды.Кто-нибудь, пожалуйста, дайте мне знать?

Заранее спасибо ...

Ответы [ 2 ]

35 голосов
/ 16 апреля 2012

Об этой сообщенной ошибке см .: http://code.google.com/p/android/issues/detail?id=18462

Обход, который я нашел, состоит в том, чтобы проверить, была ли загрузка успешной, если нет, отказаться от намерения или повторно поставить файл в очередь, если он никогда не был загружен...

Потерял пару часов, пытаясь это понять: (

** Редактировать: пример добавления кода **

/**
 * 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;                                   
}

Полный код см. https://github.com/flegare/JAV387_LaboWidget/blob/master/src/com/mobidroid/widgetfact/service/FactService.java

1 голос
/ 17 апреля 2018

Простой способ загрузки ваших файлов. Смотрите ход загрузки на панели уведомлений и даже откройте файл, когда он завершится, просто щелкнув его на панели уведомлений.

Просто вызовите этот метод, передайте имя файла и загрузите 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);

    }

выход

See the output from image below

Вы можете узнать больше здесь

...