Android DownloadManager获取文件名

23 java android broadcastreceiver receiver android-download-manager

在我的应用程序中,您可以下载一些文件 我使用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();
                }
         }
     };
Run Code Online (Sandbox Code Playgroud)

如何获取完成下载的当前文件名?

非常感谢你.

小智 21

我想你想在你的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
    }
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*sco 18

Ian Shannon对他的答案是完全正确的,但我有一些改进:

  • 记得Cursor在使用它之后关闭它,避免"光标泄漏".这Cursor会消耗大量资源,必须尽快释放.

  • 如果您为下载添加了一些标题,例如:

    DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
    request.setTitle("Some title");
    
    Run Code Online (Sandbox Code Playgroud)

    DownloadManager.COLUMN_TITLE将由"Some title"而不是文件名给出的值.所以我建议这样做:

    String filePath = c.getString(c.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
    title = filePath.substring( filePath.lastIndexOf('/')+1, filePath.length() );
    
    Run Code Online (Sandbox Code Playgroud)

    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();
Run Code Online (Sandbox Code Playgroud)

编辑:用您的DownloadManager实例替换YOUR_DM.

  • 请注意,“ COLUMN_LOCAL_FILENAME”已被弃用。您可以使用COLUMN_LOCAL_URI来获取Uri,它是实际文件的Uri。 (2认同)