Android FileProvider配置与多节点问题解决
81 浏览量
更新于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 上传
点击了解资源详情
133 浏览量
点击了解资源详情
点击了解资源详情
点击了解资源详情
点击了解资源详情
weixin_38502292
- 粉丝: 5
- 资源: 965
最新资源
- NASM中文手册.......
- PIC8位单片机汇编语言常用指令的识读.doc
- 车牌识别系统算法的研究与实现
- 从MySpace的六次重构经历,来认识分布式系统到底该如何创建
- 软件测试面试题(白盒、黑盒测试)
- 从LiveJournal后台发展看大规模网站性能优化方法
- 2009年上半年网络工程师下午题
- 2009年网络工程师上午题
- 嵌入式c c++集锦
- ajax技术资料 PDF
- ofdm_carrier_sync\A consistent OFDM carrier frequency offset estimator based on distinctively spaced pilot tones.pdf
- jsp+源码+学生成绩管理系统 jsp源代码
- 9F概论(第四版)课后习题的参考答案[1].doc
- linux内核情景分析
- 基于VB的参数化绘图.pdf
- Java设计模式中文版