web-dev-qa-db-ja.com

Android DownloadManager get filename

私のアプリでは、いくつかのファイルをダウンロードできます。 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();
                }
         }
     };

完成したダウンロードの現在のファイル名を取得するにはどうすればよいですか?

どうもありがとうございました。

23
user1456060

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
    }
}
21
Ian Shannon

イアンシャノンは彼の答えに完全に正しかったが、私はいくつかの改善を提案します:

  • 使用後は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インスタンスに置き換えます。

19
Mario Velasco

あなたが探しているのはDownloadManager.COLUMN_TITLE

Android Documents: http://developer.Android.com/reference/Android/app/DownloadManager.html#COLUMN_TITLE へのリンクは次のとおりです。

そして、これは単にタイトルを取得する以上のものを説明するチュートリアルです。 URLから画像をダウンロードしてアプリケーションに表示するためのものです。全体的に言えば、とても便利だと思います。

http://wptrafficanalyzer.in/blog/downloading-an-image-from-an-http-url-using-downloadmanager-and-displaying-in-imageview-by-dynamically-registered-broadcastreceiver/ =

1
Siddharth Lele

ダウンロードしたファイルの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 を見つけました。

0
Sean Pianka

uこのコードを試してファイル名を取得します

DownloadManager.COLUMN_LOCAL_FILENAME

よくわかりません

0
Nithinlal