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

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

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

    
    
  • 相关阅读:
    请简单介绍spring支持的常用数据库事务传播属性和事务隔离级别
    Spring Bean的作用域
    成员变量与局部变量的区别
    递归与迭代
    方法参数的传递机制 ---- 值传递
    windows phone 动画 当子控件超出父控件返回时
    把dataset 输出到 excel
    代码段
    c++ 学习纪录
    做自己的代码生成器
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/11016672.html
Copyright © 2011-2022 走看看