DownloadManager.ACTION_DOWNLOAD_COMPLETE广播接收器在Android中使用不同的下载状态多次接收相同的下载ID

时间:2012-01-20 06:57:52

标签: android download broadcastreceiver broadcast download-manager

我正在使用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_DOWNLOAD_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));

for DownloadManager.STATUS_ *常量。

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

提前致谢...

2 个答案:

答案 0 :(得分:35)

这是一个报告的错误,请参阅: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 :(得分:1)

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

只需调用此方法并传递您的文件名并下载网址

即可
 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

您可以了解更多here