zoukankan      html  css  js  c++  java
  • 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);

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

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

    
    
  • 相关阅读:
    Android UI--自定义ListView(实现下拉刷新+加载更多)
    12306火车票订票网站的一个Bug
    golang中赋值string到array
    Node.js学习(14)----EJS模板引擎
    操作系统
    springMVC学习笔记--初识springMVC
    sqlplus 连接数据库报错SP2-0642: SQL*Plus internal error state 2130, context 0:0:0
    对于事务和同步(并发)的简要理解
    Jsoup入门
    [LeetCode]Single Number
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/11016672.html
Copyright © 2011-2022 走看看