DownloadManager.ACTION\u DOWNLOAD\u完整的广播接收器在Android中多次接收相同的下载id和不同的下载状态

DownloadManager.ACTION\u DOWNLOAD\u完整的广播接收器在Android中多次接收相同的下载id和不同的下载状态,android,download,broadcastreceiver,broadcast,download-manager,Android,Download,Broadcastreceiver,Broadcast,Download Manager,我使用Android DownloadManger系统服务以以下方式下载一些文件 dwnId = mgr.enqueue(new DownloadManager.Request(serveruri) .setAllowedNetworkTypes(DownloadManager.Request.NETWORK_WIFI | DownloadManager.Request.NETWORK_MOBILE) .setAll

我使用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
是返回的唯一ID。我还注册了
ACTION\u DOWNLOAD\u COMPLETE

registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
在onDownloadComplete BroadcastReceiver的onReceive()方法中,我得到的下载Id如下

Long dwnId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0);
之后,我查询下载管理器的下载状态

Cursor c = downloadManager.query(new DownloadManager.Query().setFilterById(dwnId)); c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
对于DownloadManager.STATUS_*常量

问题是我两次收到相同的downId(意味着调用onReceive方法两次),一次是使用DownloadManager.STATUS\u成功状态,一次是使用DownloadManager.STATUS\u失败状态。我发出一次下载大约10个文件的请求,但在设备下载管理器上,它在左上角的通知栏中显示了大约12或13个下载计数。我认为下载管理器在下载文件时出现了一些问题,并恢复或自动重新启动以再次下载相同的文件。这就是为什么我请求下载的文件数量和下载队列中的实际数量之间存在差异。正因为如此,我才获得了相同的下载ID完成操作两次。如果这是真的,如何限制它。我错了吗?我请求实际下载的内容之间的计数差异的原因可能是什么?为什么广播接收器两次接收相同的下载Id。有人能告诉我吗


先谢谢你

这是一个报告的错误,请参见:

我找到的解决方法是验证下载是否成功,如果没有,则放弃意图,如果从未下载,则重新排队

我花了几个小时来琢磨这个问题:(

**编辑:添加代码示例**

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

有关完整的代码,请参见:

下载文件的简单方法,请参见通知栏中的下载进度,甚至在文件完成下载后只需在通知栏中单击即可打开文件

只需调用此方法并传递文件名和下载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);

    }
输出


如果我想开始多个并行下载,你可以了解更多信息。

@flegare,那么我如何确定哪个下载已经完成,如果我想取消特定下载,那么如何存储特定下载的downloadId。如果可能,请描述我如何做。我想知道:这仍然是一个问题吗?我在网上看到过类似的情况安卓5.0.1版的Nexus 7(2012),但它只是零星出现,我无法准确指出。这实际上是一个问题,还是我只是看到了幽灵?:在我的案例中,有一点不同-
onReceive
方法调用了两次,因为我注册了不止一次接收器:一次是通过清单,另一次是在
onCreate()中
by
registerReceiver()
方法。