私は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
は返される一意のIDです。 ACTION_DOWNLOAD_COMPLETE
にも登録しています
registerReceiver(onDownloadComplete, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
onDownloadComplete BroadcastReceiverのonReceive()メソッドでダウンロードを取得しています
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を2回受信することです(つまり、onReceiveメソッドが2回呼び出されます)。一度に約10個のファイルをダウンロードするリクエストを発行していますが、デバイスダウンロードマネージャーでは、通知バーの左上にダウンロード数が12または13と表示されています。ダウンロードマネージャーはファイルのダウンロードに問題があり、同じファイルを再度ダウンロードするために再開または自動的に再起動したと思います。そのため、ダウンロードをリクエストしたファイル数とダウンロードキューの実際の数に違いがあります。このため、同じDownloadId完了アクションを2回取得しています。これに該当する場合、それを制限する方法。リクエストしたものと実際のダウンロードのカウントが異なる理由は何ですか?ブロードキャストレシーバーが同じダウンロードIDを2回受信するのはなぜですか。誰か教えてもらえますか?
前もって感謝します...
これは報告されたバグです: 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
ファイルをダウンロードする簡単な方法。通知バーでダウンロードの進行状況を確認し、ダウンロードが完了したら通知バーでクリックするだけでファイルを開くこともできます。
このメソッドを呼び出してファイル名とダウンロード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);
}
出力
あなたはもっと学ぶことができます ここ