由于Android 4.2,如果用户下载了一些文件,在浏览器中使用的下载管理器。 如果用户点击了“下载完成”通知的意图是,总是启动。 Android 4.2或曾经有过在内容下载的文件的路径的意图,这样在此之前:
intent.getData()
将返回一个字符串,如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));
}
但光标不会返回任何行(所以q.getCount() == 0
,并为此最后return
语句抛出一个异常)。 此外,通过分析来自乌里下载文件ID黑客似乎很奇怪。
更新:我也尝试:
input = getActivity().getContentResolver().openInputStream(contentUri);
但这返回一个错误提示
许可拒绝:读取com.android.providers.downloads.DownloadProvider URI内容://下载/ all_downloads /从PID 2334 = 30950,UID = 10064要求android.permission.ACCESS_ALL_DOWNLOADS,或grantUriPermission()
通过-显然,我无法访问下载(浏览器就照我的应用程序没有启动它们) ContentProvider
。