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

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

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

    
    
  • 相关阅读:
    【转】忘记密码功能的安全实现(邮件方式)
    windows7下安装gem包---bcrypt-ruby
    Ruby中的%表示法
    ruby中特殊的全局变量
    rails中一个窗体多个模型——fields_for
    【转】深刻理解render 和 redirect_to
    UML核心元素--分析类
    UML核心元素--包
    UML核心元素--边界
    UML核心元素--用例
  • 原文地址:https://www.cnblogs.com/yongdaimi/p/11016672.html
Copyright © 2011-2022 走看看