Android FileProvider 详解

一、前言

    FileProviderContentProvider 的一个特殊子类,它可以为应用生成关联的 content:// 内容 URI ,而不是 file:/// 类型的 URI,使得应用能够实现安全地共享文件。

    内容 URI 允许授予对文件临时的读/写访问权限。当您构建一个包含内容 URI 的 Intent,并要将包含内容 URI 的 Intent 传递给客户端应用,可以通过 Intent.setFlags() API 添加访问权限,这些权限在客户端应用的接收 Activity 处于激活状态时有效(接收 Activity 栈销毁时授权自动失效);如果 Intent 是传递给 Service,在 Service 运行期间权限有效(Service 停止销毁后授权自动失效)。与之相比,控制 file:/// 类型 URI 的访问权限是通过变更文件所在的文件系统的权限来实现的,授予的访问权限是针对所有应用可用的,并且除非您手动修改权限,否则一直有效,因此这类授权是非常不安全的。内容 URI 提供的更高级别的文件访问安全性,让 FileProvider 成为 Android 安全架构基础的关键部分。

二、定义 FileProvider

    由于 FileProvider 的默认功能包含为文件生成内容 URI,因此你不需要在代码中定义 FileProvider 的子类。只需要在 AndroidManifest.xml 清单文件中声明 FileProvider,在应用清单文件的 <application> 标签内部添加 <provider> 标签来声明 FileProvider 组件。设置 android:name 属性值为 androidx.core.content.FileProvider(AndriodX);设置 android:authorities 属性为 FileProvider 生成内容 URI 的授权,授权字符串必须保证唯一(通常使用包名组装);设置 android:exported 属性为 falseFileProvider 不需要对外公开);设置 android:grantUriPermissions 属性值为 true,允许给文件授予临时访问权限。如下示例代码所示:

<provider
    android:name="androidx.core.content.FileProvider"
    android:authorities="${applicationId}.owen.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">
    <!-- ...... -->
</provider>

注意事项:
1. 对于您自己的应用,考虑使用 应用包名.fileprovider 的方式指定授权(亦可增加其他字符),防止不同应用间出现授权冲突;
2. 如果您需要重写 FileProvider 类修改默认实现,在 <provide> 标签的 android:name 属性值必须为类名全称。

三、指定可用文件

    FileProvider 只能为事先指定目录下的文件生成内容 URI。指定目录,也就是在 XML 资源文件中定义存储空间和路径。

3.1 创建 XML 资源配置

    首先需要创建一个 XML 资源文件,存放在 re

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值