Android FileProvider配置与多节点问题解决
78 浏览量
更新于2024-09-02
收藏 87KB PDF 举报
"基于Android FileProvider 属性配置详解及FileProvider多节点问题"
在Android开发中,FileProvider是一个非常重要的组件,特别是在处理与文件相关的共享和权限管理时。自Android 7.0(API级别24)起,系统对私有存储的访问有了更严格的限制,使得我们无法直接通过`Uri.fromFile()`方法来分享文件。为了解决这个问题,开发者需要使用FileProvider来生成一个安全的`Uri`,以正确地在应用间共享文件。
1. FileProvider的属性配置
FileProvider的配置主要涉及到AndroidManifest.xml中的 `<provider>` 元素。首先,你需要在 `<providers>` 标签内添加一个 `<provider>` 子元素,指定以下属性:
- `android:name`: 这里应填写`androidx.core.content.FileProvider`,它是FileProvider的类名。
- `android:authorities`: 这个属性的值通常是你应用的包名后加上".fileProvider",例如`com.example.app.fileProvider`。这个值必须是唯一的,因为它代表了FileProvider的唯一标识。
- `android:grantUriPermissions`: 设置为`true`,允许FileProvider向其他应用授予文件的URI权限。
- `android:exported`: 设置为`false`,因为FileProvider通常不用于外部应用直接访问,而是用于内部文件共享。
2. 适配Android 7.0+的代码
在代码中,你需要根据Android版本动态设置Intent的标志和数据源。对于API级别23以上,你需要使用`Intent.FLAG_GRANT_READ_URI_PERMISSION`,并使用`FileProvider.getUriForFile()`方法获取`Uri`。对于更低版本,你可以直接使用`Uri.fromFile()`。
示例代码:
```java
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.M) {
intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
Uri contentUri = FileProvider.getUriForFile(context, SysInfo.packageName + ".fileProvider", outputFile);
intent.setDataAndType(contentUri, "application/vnd.android.package-archive");
} else {
intent.setDataAndType(Uri.fromFile(outputFile), "application/vnd.android.package-archive");
}
```
3. 创建provider_paths.xml
在res/xml目录下创建`provider_paths.xml`文件,定义FileProvider可以访问的文件路径。在这个文件中,你可以使用不同的路径元素(如`external-path`或`files-path`)来指定文件路径。
示例配置:
```xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<!-- /storage/emulated/0/Download/${applicationId}/.beta/apk -->
<external-path name="beta_external_path" path="Download/"/>
<!-- /storage/emulated/0/Android/data/${applicationId}/files/apk/ -->
<external-path name="beta_external_files_path" path="Android/data/"/>
</paths>
```
- `name`属性用于在代码中引用这些路径,例如`context.grantUriPermission(packageName, contentUri, Intent.FLAG_GRANT_READ_URI_PERMISSION);`
- `path`属性定义了文件的实际路径,可以是绝对路径或相对于外部存储根目录的相对路径。
4. 多节点问题
当你的应用需要访问多个文件夹或文件时,可以在`provider_paths.xml`中定义多个路径元素,如上例所示的`beta_external_path`和`beta_external_files_path`。每个元素都代表一个可以被FileProvider解析和访问的文件路径。
5. 权限请求
记得在AndroidManifest.xml中为FileProvider添加读写权限,例如:
```xml
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
```
对于运行在Android 6.0(API级别23)及更高版本的设备,还需要在运行时请求这些权限。
FileProvider在Android 7.0+中扮演了关键角色,通过正确的属性配置和路径定义,以及适当的代码适配,可以确保应用在不同版本的Android系统上都能正确地分享和访问文件。
2019-02-16 上传
2018-06-07 上传
2017-11-16 上传
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38502292
- 粉丝: 5
- 资源: 965
最新资源
- SSM动力电池数据管理系统源码及数据库详解
- R语言桑基图绘制与SCI图输入文件代码分析
- Linux下Sakagari Hurricane翻译工作:cpktools的使用教程
- prettybench: 让 Go 基准测试结果更易读
- Python官方文档查询库,提升开发效率与时间节约
- 基于Django的Python就业系统毕设源码
- 高并发下的SpringBoot与Nginx+Redis会话共享解决方案
- 构建问答游戏:Node.js与Express.js实战教程
- MATLAB在旅行商问题中的应用与优化方法研究
- OMAPL138 DSP平台UPP接口编程实践
- 杰克逊维尔非营利地基工程的VMS项目介绍
- 宠物猫企业网站模板PHP源码下载
- 52简易计算器源码解析与下载指南
- 探索Node.js v6.2.1 - 事件驱动的高性能Web服务器环境
- 找回WinSCP密码的神器:winscppasswd工具介绍
- xctools:解析Xcode命令行工具输出的Ruby库