1. 程式人生 > >Android下載器 DownloadManager 使用Uri指定下載路徑Bug

Android下載器 DownloadManager 使用Uri指定下載路徑Bug

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

在這上面栽了很大個跟頭,檔案直接無法下載。

希望大家引以為戒 ,少走彎路。