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);

在这上面栽了很大个跟头,文件直接无法下载。

希望大家引以为戒 ,少走弯路。


原文地址:https://www.cnblogs.com/yongdaimi/p/11016672.html