私のアプリでは、いくつかのファイルをダウンロードできます。 Android DownloadManager
クラスをダウンロードに使用しました。ダウンロードが完了すると、ファイルがダウンロードされたことを示すメッセージが表示されます。問題は、2つある可能性があります。同時に3つまたは4つのダウンロード。BroadcastReceiver
コードは次のようになります。
receiver_complete = new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action.equals(DownloadManager.ACTION_DOWNLOAD_COMPLETE) ){
Toast.makeText(MainActivity.this, MainActivity.this.getString(R.string.download_finished, "Here should be the name", Toast.LENGTH_SHORT).show();
}
}
};
完成したダウンロードの現在のファイル名を取得するにはどうすればよいですか?
どうもありがとうございました。
if
ブロックの中にこのようなものを入れたいと思います。置換YOUR_DM
をDownloadManagerインスタンスに置き換えます。
Bundle extras = intent.getExtras();
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
Cursor c = YOUR_DM.query(q);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
if (status == DownloadManager.STATUS_SUCCESSFUL) {
// process download
title = c.getString(c.getColumnIndex(DownloadManager.COLUMN_TITLE));
// get other required data by changing the constant passed to getColumnIndex
}
}
イアンシャノンは彼の答えに完全に正しかったが、私はいくつかの改善を提案します:
使用後はCursor
を閉じて、「カーソルリーク」を回避してください。これはCursor
が多くのリソースを消費するため、できるだけ早く解放する必要があります。
次のようなダウンロード用のタイトルを付けた場合:
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setTitle("Some title");
DownloadManager.COLUMN_TITLE
で指定された値は、ファイル名ではなく"Some title"
になります。だから私は代わりにこれをお勧めします:
String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
COLUMN_LOCAL_FILENAME
はパス全体(/storage/sdcard0/Android/data/.../filename.ext
)を返しますが、このコードではファイル名のみを取得します。
最終コード:
Bundle extras = intent.getExtras();
DownloadManager.Query q = new DownloadManager.Query();
q.setFilterById(extras.getLong(DownloadManager.EXTRA_DOWNLOAD_ID));
Cursor c = YOUR_DM.query(q);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
if (status == DownloadManager.STATUS_SUCCESSFUL) {
String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
filename = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
}
}
c.close();
編集: YOUR_DMをDownloadManagerインスタンスに置き換えます。
あなたが探しているのはDownloadManager.COLUMN_TITLE
Android Documents: http://developer.Android.com/reference/Android/app/DownloadManager.html#COLUMN_TITLE へのリンクは次のとおりです。
そして、これは単にタイトルを取得する以上のものを説明するチュートリアルです。 URLから画像をダウンロードしてアプリケーションに表示するためのものです。全体的に言えば、とても便利だと思います。
ダウンロードしたファイルのURIを取得する簡単な方法があり、それはgetUriForDownloadedFile
を使用することです。
download_receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Bundle b = intent.getExtras();
DownloadManager dm = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
long file_id = b.getLong(DownloadManager.EXTRA_DOWNLOAD_ID);
Uri uri = dm.getUriForDownloadedFile(downloaded_file_id);
}
}
BroadcastReceiverを使用してDOWNLOAD_COMPLETEイベントを処理する方法の詳細な説明で、このメソッド here を見つけました。
uこのコードを試してファイル名を取得します
DownloadManager.COLUMN_LOCAL_FILENAME
よくわかりません