DownloadManager.Действие загрузить полный широковещательный приемник, получающий один и тот же идентификатор загрузки более одного раза с разными статусами загрузки в Android
Я использую Android DownloadManger System Service для загрузки некоторых файлов следующим образом
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));
и в методе onReceive() onReceive () Ondownloadcomplete BroadcastReceiver я получаю идентификатор загрузки, как
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_SUCCESSFUL статус и один раз с DownloadManager.Статус STATUS_FAILED для dwnId. Я выдаю запрос на загрузку 10 файлов за раз, но в диспетчере загрузки устройств он показывает количество загрузок как некоторые 12 или 13 в верхней левой панели уведомлений. Я думаю, что менеджер загрузки имеет некоторые проблемы в загрузка файлов и возобновлена или автоматически перезапущена, чтобы загрузить тот же файл снова. Вот почему существует разница между количеством файлов, которые я просил загрузить, и фактическим числом в очереди загрузки. Из-за этого только я получаю одно и то же действие DownloadId complete дважды. Если это правда, то как ее ограничить. Я ошибаюсь, что может быть причиной разницы в количестве между тем, что я запросил для фактической загрузки? Почему широковещательный приемник получает один и тот же идентификатор загрузки дважды. Может кто-нибудь пожалуйста, дайте мне знать?
Заранее Спасибо...
2 ответов
Это ошибки вижу: http://code.google.com/p/android/issues/detail?id=18462
способ, который я нашел, - проверить, была ли загрузка успешной, если не отбросить намерение или повторно поставить файл в очередь, если он никогда не был загружен...
потерял пару часов, вычисляя, что один : (
* * Edit: добавление примера кода**
/**
* 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
простой способ загрузить файлы, см. раздел ход загрузки в панели уведомлений и даже открыть файл, когда он будет завершен для загрузки, просто щелкнув его в панели уведомлений.
просто вызовите этот метод и передайте свое имя файла и загрузите 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);
}
выход
вы можете узнать больше здесь