聊聊对Andorid的FileProvider的理解

最近在项目中遇到一个有关FileProvider的问题,由此来学习了一下FileProvider,有关笔记记录如下。

FileProvider是 Android 系统中一个特殊的内容提供者(ContentProvider), 它主要用于应用之间安全的共享文件。通过 FileProvider,应用可以生成一个 content URI并授予其它应用临时访问的权限,而不需要将文件的实际路径暴露给其它应用。这样可以有效的避免安全问题。

主要用途

FileProvider主要应用于以下几种场景:

  1. 文件共享:当一个应用需要与另外一个应用共享文件时(比如使用Intent发送图片/文件),可以使用 FileProvider来生成一个 content URI;
  2. 文件访问控制:通过 FileProvider 可以控制其他应用对文件的读写权限,确保文件访问的安全性;
  3. 避免使用file://URI:由于从Andorid 7.0起,file://URI被弃用,使用 FileProvider 提供的 content URI 可以避免兼容性。
使用步骤

a. 在 AndroidManifest.xml 中声明 FileProvider:

<providerandroid:name="androidx.core.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:exported="false"android:grantUriPermissions="true"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" />
</provider>

b. 配置文件路径

res/xml 目录下创建一个 file_paths.xml 文件,定义共享文件的路径。

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path name="my_files" path="." />
</paths>

c. 生成 content URI
使用 FileProvider.getUriForFile() 方法来生成一个 content URI。

File file = new File(context.getExternalFilesDir(null), "example.jpg");
Uri contentUri = FileProvider.getUriForFile(context, "com.example.myapp.fileprovider", file);

d. 授予临时权限,并分享

当通过Intent发送文件时,可以授予接收临时访问文件的权限:

Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(Intent.EXTRA_STREAM, contentUri);
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);startActivity(Intent.createChooser(intent, "Share image via"));

详细解释 file_paths.xml

file_paths.xml, <external-files-path name="my_files" path="." />的解释如下:

  • external-files-path 用于指定应用的外部私有存储目录中的文件路径。外部私有存储目录是指通过 Context.getExternalFilesDir()方法获取的目录,它通常用于存储应用专属的文件,这些文件会随着应用的卸载而被删除。
  • name=“my_files”: 这是一个可选的属性,用于为这个路径配置起一个别名。在生成的Content URI中,这个别名会作为路径的一部分。如果不需要这个别名,那么也可以直接去掉。
  • path="."这个属性指定了相对于 external-files-path 目录的相对路径. "."代表当前目录,即整个 external-files-path 所在的目录。如果你想指定该目录下的某个子目录,你可以在 path属性中提供相对路劲,例如path=“images/”.

我们来一个例子:

假设我们的包名是com.xing.dev,并且在 file_path.xml中配置了如下内容:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><external-files-path name="my_files" path="." />
</paths>

然后通过getExternalFilesDir获取文件保存目录,并且在该目录下有一个a.png文件:

File file = new File(context.getExternalFilesDir(null), "a.png");
Uri contentUri = FileProvider.getUriForFile(context, "com.xing.dev.fileprovider", file);

那么,此时生成的 contentUri就应该是如下的样子:

content://com.xing.dev.fileprovider/my_files/a.png

当然,我们还可以配置更加复杂的路径:

如果我现在只想别的应用仅仅共享特定目录下的文件,那么我就可以配置更加具体的路径:

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">  <external-files-path name="images" path="images/" />  <external-files-path name="docs" path="documents/" />
</paths>

这样,那么就只能访问 /external-files-path /images/ 和 /external-files-path/documents/ 文件夹下的文件了。

那么,除了external-files-path 这个外部私有存储目录中的文件路径,file_paths.xml中还支持哪些tag呢?

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><!-- Environment.getExternalStorageDirectory() --><external-path name="external_files" path="." /><!-- Context.getExternalFilesDir(String) --><external-files-path name="external_files_path" path="." /><!-- Context.getExternalCacheDir() --><external-cache-path name="external_cache_path" path="." /><!-- Context.getFilesDir() --><files-path name="internal_files_path" path="." /><!-- Context.getCacheDir() --><cache-path name="internal_cache_path" path="." /></paths>

目前来说,现在支持的是5个,分别是external-path,external-files-path,external-cache-path , files-pathcache-path, 可以通过下表来查看他们之间的含义:

假设我们的包名还是上面那个:com.xing.dev:

标签名称对应java代码路径Demo含义
external-pathEnvironment.getExternalStorageDirectory()/storage/emulated/0整个外部存储目录
external-files-pathContext.getExternalFilesDir(String)/storage/emulated/0/Android/data/com.xing.dev/files应用的外部私有存储目录中的文件路径
external-cache-pathContext.getExternalCacheDir()/storage/emulated/0/Android/data/com.xing.dev/cache应用的外部私有存储目录中的缓存路径
files-pathContext.getFilesDir()/data/user/0/com.xing.dev/files应用的内部私有存储目录中的文件路径
cache-pathContext.getCacheDir()/data/user/0/com.xing.dev/cache应用的内部私有存储目录中的缓存路径

那么,如果我们理解了以上文件目录所代表的含义,那么使用FileProvider就非常容易了。总结下来,我们就可以有以下步骤:

  1. 确定我们需要共享文件的位置,是在整个外部存储目录中(这个显然不是特别安全,不推荐使用),还是在外部/内部私有文件/缓存目录中;
  2. 确定好之后,那么我们可以确定使用哪个标签;
  3. 确定好标签之后,如果还有更细粒度的要求,我们还可以加上子文件夹;
  4. 确定好 file_paths.xml之后,可以通过代码获取对应目标的文件夹,然后生成对应的 ContentURI;
  5. 最后就可以进行分享了。

对于一个越来越安全的android系统,使用FileProvider将App的存储目录分为5个部分,然后通过各自定义文件配置,实现对文件精细粒度的控制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/27946.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。

C#医院体检系统源码 PEIS源码 系统核心功能、特点、类型、设备对接-PACS放射科设备对接:DR、CT、MRI、钼靶。 体检系统是为体检中心、医院体检科等体检机构专门开发的全流程管理系统。该系统通过软件实现检测仪器数据的自动提取&#xff0c;内置多级医生工作台&#xff0c;旨在…

每日一练:攻防世界:ewm

这道题我尝试了使用montagegaps解题&#xff0c;但是没有解出来&#xff0c;图片数量不是很多&#xff0c;可以尝试用PS直接拼图&#xff0c;但是这样学不到东西&#xff0c;我也就没尝试&#xff0c;直接看的官方WP 这段代码应该是改变工作目录到small&#xff0c;并且变量当…

基于springboot的宠物商城网站

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于springboot的宠物商城网站,java项目…

软件复盘的目的及作用

一、软件复盘的目的 软件复盘是一种在软件开发完成后、通过整理软件开发工作中的经验和教训以及对软件缺陷、进度、质量等问题的反思&#xff0c;识别和总结出开发团队应该坚持和改进的软件开发过程和技术的工作方式。软件复盘的主要目的是&#xff1a; 识别和总结软件开发过…

【Ubuntu20.04】安装XRDP远程桌面服务

【Ubuntu20.04】安装XRDP远程桌面服务 安装xrdp sudo apt install xrdp sudo adduser xrdp ssl-cert sudo systemctl restart xrdp黑屏解决 修改startwm.sh文件 sudo gedit /etc/xrdp/startwm.sh在test -x /etc/X11/Xsession上一行添加 unset DBUS_SESSION_BUS_ADDRESS un…

Linux C编译器从零开发二

自定义分词器 test.c #include <ctype.h> #include <stdarg.h> #include <stdbool.h> #include <stdio.h> #include <stdlib.h> #include <string.h>typedef enum {TK_PUNCT, // PunctuatorsTK_NUM, // Numeric literalsTK_EOF, // …

基于carsim的线控转向仿真(1)--carsim车辆模型目标角度跟踪

一、Rwa转向执行总成建模 Rwa包括齿轮齿条机构、转向组件以及转向执行电机&#xff1b;如下图&#xff0c;电机输出轴通过齿轮减速增扭后&#xff0c;再经过一个半径为rp的小齿轮&#xff0c;直接带动齿条左右移动。齿条的移动通过转向摇臂&#xff0c;带动车轮转动&#xff0c…

使用 Apache SkyWalking 进行 Spring Cloud 应用的分布式追踪与监控:完整教程

使用 Apache SkyWalking 进行 Spring Cloud 应用的分布式追踪与监控&#xff1a;完整教程 SkyWalking 是一款开源的分布式追踪、性能监控和诊断平台&#xff0c;适用于微服务、云原生和容器化应用。它能够在分布式系统中收集和分析各个服务之间的调用关系和性能数据&#xff0…

PySide(PyQt)实现鼠标画框局部放大

按住鼠标左键画框&#xff0c;裁切画面并局部放大&#xff0c;可以用来生成ROI 1、在QtDesigner中创建ui文件&#xff0c;命名为crop.ui&#xff1a; 2、自定义脚本ImageLabel.py &#xff1a; from PySide6.QtCore import Qt, QRect, Signal, QPoint from PySide6.QtGui impo…

Redis高并发高可用

1. 复制机制 在分布式系统中&#xff0c;为了解决单点问题&#xff0c;通常会将数据复制多个副本部署到其他机器&#xff0c;以满足故障恢复和负载均衡等需求。Redis提供了复制功能&#xff0c;实现了相同数据的多个Redis副本。复制功能是高可用Redis的基础&#xff0c;后面的…

Unity 6预览版即将增加对visionOS 2的支持

Unity表示&#xff0c;届时将能帮助你创建更为身临其境的体验&#xff0c;并通过以下主要功能实现更大的视觉多样性&#xff1a; 支持混合形状&#xff0c;以实现更广泛的几何应用&#xff0c;包括变形和平滑&#xff0c;自然的动画。 立体渲染目标&#xff0c;帮助用户实现广…

长亭网络通信基础

长亭笔试之前就已经学过一遍了 这算温故而知新吧 TCP/IP 首先我在这里默写一下之前的7层和4层 应用层 应 【表示层 数据格式转换 传 【会话层 …

Vue 3 的常用响应式 API 总结

在vue3.x版本中&#xff0c;setup函数就是vue3 组合式API的入口&#xff0c;换句话说就是在setup中的写的代码&#xff0c;就是组合式API 的写法。下面总结常用的与响应式相关的api, 帮助您在 Vue 3 中创建响应式应用程序。 reactive() 和 ref()&#xff1a; 创建响应式对象和…

课设--学生成绩管理系统(一)

欢迎来到 Papicatch的博客 文章目录 &#x1f349;技术核心 &#x1f349;引言 &#x1f348;标识 &#x1f348;背景 &#x1f348;项目概述 &#x1f348; 文档概述 &#x1f349;可行性分析的前提 &#x1f348;项目的要求 &#x1f348;项目的目标 &#x1f348;…

Android 蓝牙配对Settings应用里面的简要流程记录

Android 蓝牙配对Settings应用里面的简要流程记录 文章目录 Android 蓝牙配对Settings应用里面的简要流程记录一、前言二、Settings蓝牙配对的关键代码1、接收蓝牙请求的地方 AndroidManifest.xml2、BluetoothPairingRequest3、BluetoothPairingService4、BluetoothPairingDial…

神经网络-文本-图像-音频-视频基础知识

文本、图像、音频和视频是数字媒体中的四种基本类型&#xff0c;它们各有不同的组成、单位和基础知识。下面我将逐一解释&#xff1a; 文本 组成&#xff1a;文本由字符组成&#xff0c;可以表示字母、数字、标点符号、特殊字符等。单位&#xff1a;文本的单位通常是字符&#…

宿舍用电管理模块一进三出的升级改造

宿舍用电管理模块一进三出石家庄光大远通电气有限公司产品在高校日常管理工作中,宿舍管理是一项重要工作。宿舍管理内容复杂,而且涉及学生的日常生活,意义重大。其中,学生宿舍内漏电,超负荷用电,违规用电等现象一直是困扰后勤管理的普遍问题。随着学生日常生活方式以及生活用品…

驱动开发(五):Linux内核定时器

驱动开发系列文章&#xff1a; 驱动开发&#xff08;一&#xff09;&#xff1a;驱动代码的基本框架 驱动开发&#xff08;二&#xff09;&#xff1a;创建字符设备驱动 驱动开发&#xff08;三&#xff09;&#xff1a;内核层控制硬件层 驱动开发&#xff08;四&#xff…

移动端超超超详细知识点总结(Part4)

rem基础 1. rem单位 rem (root em)是一个相对单位&#xff0c;类似于em&#xff0c;em是父元素字体大小。不同的是rem的基准是相对于html元素的字体大小。比如&#xff0c;根元素&#xff08;html&#xff09;设置font-size12px; 非根元素设置width:2rem;则换成px表示就是24p…

数据防泄漏的六个步骤|数据防泄漏软件有哪些

在当前复杂多变的网络安全环境下&#xff0c;数据防泄漏软件成为了企业信息安全架构中不可或缺的一环。下面以安企神软件为例&#xff0c;告诉你怎么防止数据泄露&#xff0c;以及好用的防泄露软件。 1. 安企神软件 安企神软件是当前市场上备受推崇的企业级数据防泄漏解决方案…