从 Android 4.2 开始,如果用户在浏览器中下载某些文件,则使用 DownloadManager。如果用户单击“下载完成”通知,则 Intent 将始终启动。在 Android 4.2 之前,intent 曾经在内容中包含下载文件的路径,例如:
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
语句会引发异常)。此外,通过从 Uri 解析下载文件 id 的破解似乎很奇怪。
更新:我也试过:
input = getActivity().getContentResolver().openInputStream(contentUri);
但这会返回一个错误说明
权限拒绝:从 pid=30950、uid=10064 读取 com.android.providers.downloads.DownloadProvider uri content://downloads/all_downloads/2334 需要 android.permission.ACCESS_ALL_DOWNLOADS 或 grantUriPermission()
显然我无法通过ContentProvider
.