由于
Android 4.2如果用户在浏览器中下载了一些文件,则使用DownloadManager.如果用户点击“下载完成”通知,则意图始终启动.在Android 4.2之前,意图曾经将下载的文件路径放在内容中,这样:
intent.getData()
将返回一个String,如file:///storage/emulated/0/Download/some_file.ext.然而,由于Android 4.2,下载管理器通过内容方案广播和意图,例如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);
但这会返回错误说明
权限拒绝:阅读com.android.providers.downloads.DownloadProvider uri内容:// downloads / all_downloads / 2334 from pid = 30950,uid = 10064需要android.permission.ACCESS_ALL_DOWNLOADS或grantUriPermission()
显然,我无法通过ContentProvider访问下载(因为我的应用没有启动它们 – 浏览器).