使用DownloadManager 下載文件 一般寫法:java
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 並做爲文件下載路徑 能夠這樣:android
Uri apkUri =Uri.fromFile(apkFile);
獲取到的Uri 以file://開頭app
7.0以後 須要藉助FileProvider來加密文件的Uri 以下:ide
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { apkUri = Uri.fromFile(apkFile); } else { apkUri = FileProvider.getUriForFile(this, getPackageName() + ".fileProvider", apkFile); }
獲取到的Uri 以content://開頭ui
若是使用content://開頭 的 Uri 指定下載目標路徑this
request.setDestinationUri(apkUri); int downloadId = dm.enqueue(request);
會報錯
java.lang.IllegalArgumentException: Not a file URI: content://加密
官方提供的API,卻沒法識別遵循官方寫法產生的Urispa
所以code
request.setDestinationUri(apkUri);
使用的 apkUri 必須仍是以file://開頭的,即:blog
apkUri = Uri.fromFile(apkFile);
在這上面栽了很大個跟頭,文件直接沒法下載。
但願你們引覺得戒 ,少走彎路。