解决安卓7.0应用件共享文件问题

之前我在安卓各版本市场占有率及特性文章里面提到了7.0特性,其中对我们开发人员来讲最重要的影响就是“应用件共享文件”,就是对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。
如果不这样做你会在使用系统拍照以及安装APK时使程序死掉。

(1)声明provider

在manifest文件中声明此权限:

(2)编写resource xml file

在res下新建一个xml文件夹在新建一个文件file_paths即上面provider里面调用的resourse

在paths节点内部支持以下几个子节点,分别为:

<root-path/> 代表设备的根目录new File("/");
<files-path/> 代表context.getFilesDir()
<cache-path/> 代表context.getCacheDir()
<external-path/> 代表Environment.getExternalStorageDirectory()
<external-files-path>代表context.getExternalFilesDirs()
<external-cache-path>代表getExternalCacheDirs()

每个节点都支持两个属性:

name
path
path即为代表目录下的子目录,比如:

<external-path
        name="external"
        path="pics" />
代表的目录即为:Environment.getExternalStorageDirectory()/pics,其他同理。

当这么声明以后,代码可以使用你所声明的当前文件夹以及其子文件夹。

本例使用的是SDCard所以这么写即可:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external" path="" />
</paths>
为了简单,我们直接使用SDCard根目录,所以path里面就不填写子目录了~这里你可能会有疑问,为什么要写这么个xml文件,有啥用呀?刚才我们说了,现在要使用content://uri替代file://uri,那么,content://的uri如何定义呢?总不能使用文件路径吧,那不是骗自己么所以,需要一个虚拟的路径对文件路径进行映射,所以需要编写个xml文件,通过path以及xml节点确定可访问的目录,通过name属性来映射真实的文件路径。

在7.0之前我们通过系统拍照保存文件路径是这样写的:

Uri uriTemp = Uri.fromFile(new File(fileTemp, "临时.jpg"));

现在需要写成:Uri uriTemp = FileProvider.getUriForFile(this, "com.zhy.android7.fileprovider", new File(fileTemp, "临时.jpg"));

com.zhy.android7.fileprovider即是

authorities完整路径。

详情请看文章:

Android 7.0 行为变更 通过FileProvider在应用间共享文件吧

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值