一、前言
FileProvider 是 ContentProvider 的一个特殊子类,它可以为应用生成关联的 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 属性为 false(FileProvider 不需要对外公开);设置 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

最低0.47元/天 解锁文章
704

被折叠的 条评论
为什么被折叠?



