Android DownloadManager 获取文件名

问题描述 投票:0回答:6

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

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

非常感谢。

java android broadcastreceiver android-download-manager receiver
6个回答
22
投票

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 实例。


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
    }
}

1
投票

我认为您正在寻找的是

DownloadManager.COLUMN_TITLE

这里是 Android 文档的链接: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
投票

有一种更简单的方法来检索下载的文件 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);

    }
}

我在here找到了这个方法,详细描述了如何使用 BroadcastReceiver 来处理 DOWNLOAD_COMPLETE 事件。


0
投票

实际上是2023年

import android.net.Uri;
import android.webkit.URLUtil;

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
String filename = URLUtil.guessFileName(url, contentDisposition, mimeType);

不是从 url 解析中找到的,而是从

收到的
Content-Disposition: attachment; filename="myDocument.FileName"

-1
投票

你尝试这个代码来获取文件名

DownloadManager.COLUMN_LOCAL_FILENAME

我不确定

© www.soinside.com 2019 - 2024. All rights reserved.