从捕获的DownloadManager意图中检索文件路径

Eri*_*Kok 11 android download-manager android-intent

从Android 4.2开始,如果用户在浏览器中下载某个文件,则使用DownloadManager.如果用户单击"下载完成"通知,则始终启动Intent.在Android 4.2之前,意图用于在内容中包含下载文件的路径,例如:

intent.getData()
Run Code Online (Sandbox Code Playgroud)

会返回一个字符串,如file:///storage/emulated/0/Download/some_file.ext.但是,自Android 4.2以来,下载管理器使用一种content方案进行广播和意图,例如content://downloads/all_downloads/2334.

如何检索下载文件的本地文件路径?

我尝试过以下方法:

public static String getRealPathFromURI(Uri contentUri, Activity activity) {
    DownloadManager downloadManager = (DownloadManager) activity.getSystemService(Activity.DOWNLOAD_SERVICE);
    String[] contentParts = contentUri.getEncodedPath().split("/");
    Cursor q = downloadManager.query(new DownloadManager.Query().setFilterById(Integer.parseInt(contentParts[contentParts.length - 1])));
    if (q == null) {
        // Download no longer exists
        return null;
    }
    q.moveToFirst();
    return q.getString(q.getColumnIndex(DownloadManager.COLUMN_LOCAL_FILENAME));
}
Run Code Online (Sandbox Code Playgroud)

但是游标永远不会返回任何行(q.getCount() == 0因此,最后一个return语句会抛出异常).此外,通过从Uri解析下载文件ID的hack似乎很奇怪.

更新:我也尝试过:

input = getActivity().getContentResolver().openInputStream(contentUri);
Run Code Online (Sandbox Code Playgroud)

但这会返回一个错误说明

权限拒绝:阅读com.android.providers.downloads.DownloadProvider uri content:// downloads/all_downloads/2334 from pid = 30950,uid = 10064需要android.permission.ACCESS_ALL_DOWNLOADS或grantUriPermission()

很明显,我无法访问下载(因为我的应用程序没有启动它们 - 浏览器确实)通过ContentProvider.

Eri*_*Kok 5

这是有效的.首先,你不能(也不应该)获得正确指出botteaap的文件路径.(告诉他让我走上正确的道路.)相反,您会自动获得临时权限以访问文件内容,使用:

InputStream input = getContentResolver().openInputStream(intent.getData());
Run Code Online (Sandbox Code Playgroud)

您可以InputStream像Java中的任何其他内容一样阅读此内容 似乎无法获取文件名.如果需要文件,请先将输入流写入(临时)文件.

SecurityException是当你的临时访问被吊销扔.对于我来说,这种情况发生在我之前尝试读取错误的一些文件上,特别是当我在Acticity中获取Intent时onNewIntent.


bot*_*aap 2

通过内容解析器获取它是正确的事情。并非每个内容 url 都会成为文件。例如,Gallery 应用程序将为您提供 uri,根据来源将其转换为网络调用或本地文件。

即使您到达真实的文件路径,由于文件权限的原因,您也可能无法读取它,尽管您可能很幸运它位于外部存储上。您是否尝试过android.permission.ACCESS_ALL_DOWNLOADS按照异常提示添加到您的应用程序中? 这是行不通的,因为权限处于签名级别:(