android DownloadManager: java.lang.IllegalArgumentException: Not a file URI: content://
DownloadManager 使用Uri指定下载路径Bug
使用DownloadManager 下载文件 通常写法:
DownloadManager dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE); //Uri.parse(apkUrl) 指定文件下载地址 DownloadManager.Request request = new DownloadManager.Request(Uri.parse(apkUrl)); request.setMimeType("application/vnd.android.package-archive"); //apkUri 指定文件下载路径 request.setDestinationUri(apkUri); //画重点 int downloadId = dm.enqueue(request); ......
7.0之前 获取Uri 并作为文件下载路径 可以这样:
Uri apkUri =Uri.fromFile(apkFile);
获取到的Uri 以file://开头
7.0之后 需要借助FileProvider来加密文件的Uri 如下:
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { apkUri = Uri.fromFile(apkFile); } else { apkUri = FileProvider.getUriForFile(this, getPackageName() + ".fileProvider", apkFile); }
获取到的Uri 以content://开头
雷点
如果使用content://开头 的 Uri 指定下载目标路径
request.setDestinationUri(apkUri); int downloadId = dm.enqueue(request);
会报错
java.lang.IllegalArgumentException: Not a file URI: content://
官方提供的API,却无法识别遵循官方写法产生的Uri
因此
request.setDestinationUri(apkUri);
使用的 apkUri 必须还是以file://开头的,即:
apkUri = Uri.fromFile(apkFile);
在这上面栽了很大个跟头,文件直接无法下载。
希望大家引以为戒 ,少走弯路。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步