Android FileProvider 属性配置详解及FileProvider多节点问题

Android FileProvider 应用间共享媒体资源 先参考以下两个文档: 官网介绍:https://developer.android.google.cn/training/data-storage/use-cases TX 介绍:https://developers.weixin.qq.com/community/develop/doc/0004886026c1a8402d2a040ee5b401 然后基于以上的文档做一个例子介绍: 从FileProviderSender Apk共享一张保存在 应用专属空间 (Android/data/.... 阅读详情

众所周知在android7.0,修改了对私有存储的限制,导致在获取资源的时候,不能通过Uri.fromFile来获取uri了我们需要适配7.0+的机型需要这样写:

1:代码适配

  if (Build.VERSION.SDK_INT > 23) {//
                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");
            }

2:创建provider_paths.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>

其中 provider_path属性详解

 name和path

name:uri路径片段。为了执行安全,这个值隐藏你所共享的子目录名。此值的子目录名包含在路径属性中。
path:你所共享的子目录。虽然name属性是一个URI路径片段,但是path是一个真实的子目录名。注意,path是一个子目录,而不是单个文件或者多个文件。
1.files-path
[html] view plain copy
  1. 代表与Context.getFileDir()相同的文件路径

2.cache-path

[html] view plain copy
  1. <cache-path name="name" path="path" />  

代表与getCacheDir()相同的文件路径


3.external-path

[html] view plain copy
  1. <external-path name="name" path="path" />  
代表与Environment.getExternalStorageDirectory()相同的文件路径

4.external-files-path

[html] view plain copy
  1. <external-files-path name="name" path="path" />  
代表与Context#getExternalFilesDir(String) 和Context.getExternalFilesDir(null)相同的文件路径

5.external-cache-path

[html] view plain copy
  1. <external-cache-path name="name" path="path" />  

代表与Context.getExternalCacheDir()相同的文件路径

6:配置AndroidManifest.xml

android:authorities在FileProvider中使用

[html]  view plain  copy
  1. <provider  
  2.     android:name="android.support.v4.content.FileProvider"  
  3.     android:authorities="com.mydomain.fileprovider"  
  4.     android:exported="false"  
  5.     android:grantUriPermissions="true">  
  6.     <meta-data  
  7.         android:name="android.support.FILE_PROVIDER_PATHS"  
  8.         android:resource="@xml/file_paths" />  
  9. </provider>  

7:使用FileProvider

*** 返回URI:content://com.mydomain.fileprovider/my_images/default_image.jpg.

[java]  view plain  copy
  1. File imagePath = new File(Context.getFilesDir(), "images");  
  2. File newFile = new File(imagePath, "default_image.jpg");  
  3. Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);  

8.自定义FileProvider


[java]  view plain  copy
  1. class MyFileProvider extends FileProvider {}  
  2. AndroidMenifest.xml中配置  android:authorities即可  

3:我们项目中可能会用到其他一些第三方sdk有用到拍照功能的话,他也为了适配android7.0也添加了这个节点,此时有些人可能就不知道如何下手了,其实很简单我们只要重写一个类 继承自FileProvider,然后就按上述方法在添加一个节点就可以了:

<provider
    android:name="com.blueZhang.MyFileProvider"
    android:authorities="${applicationId}.provider"
    android:grantUriPermissions="true"
    android:exported="false">
    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/cust_file_paths" />
</provider>

如果你不想自定义FileProvider,那么还有一种方法,那就是把第三方sdk中的路径配置copy到provider_paths.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/"/>

    <external-path name="external_storage_root" path="."/>
    <files-path name="files" path="."/>

</paths>

注意⚠️:在使用provider时 配置路径 path="."代表所有路径 


生成 Content URI

在 Android 7.0 出现之前,我们通常使用 Uri.fromFile() 方法生成一个 File URI。这里,我们需要使用 FileProvider 类提供的公有静态方法 getUriForFile 生成 Content URI。比如:

Uri contentUri = FileProvider.getUriForFile(this,
                BuildConfig.APPLICATION_ID + ".fileProvider", myFile);
  • 1
  • 2

需要传递三个参数。第二个参数便是 Manifest 文件中注册 FileProvider 时设置的 authorities 属性值,第三个参数为要共享的文件,并且这个文件一定位于第二步我们在 path 文件中添加的子目录里面。

举个例子:

String filePath = Environment.getExternalStorageDirectory() + "/images/"+System.currentTimeMillis()+".jpg";
File outputFile = new File(filePath);
if (!outputFile.getParentFile().exists()) {
    outputFile.getParentFile().mkdir();
}
Uri contentUri = FileProvider.getUriForFile(this,
        BuildConfig.APPLICATION_ID + ".fileProvider", outputFile);
  • 生成的 Content URI 是这样的:
content://com.yifeng.samples.myprovider/my_images/1493715330339.jpg

其中,构成 URI 的 host 部分为 <provider> 元素的 authorities 属性值(applicationId + customname),path 片段 my_images 为 res/xml 文件中指定的子目录别名(真实目录名为:images)。

第四步,授予 Content URI 访问权限

生成 Content URI 对象后,需要对其授权访问权限。授权方式有两种:

第一种方式,使用 Context 提供的 grantUriPermission(package, Uri, mode_flags) 方法向其他应用授权访问 URI 对象。三个参数分别表示授权访问 URI 对象的其他应用包名,授权访问的 Uri 对象,和授权类型。其中,授权类型为 Intent 类提供的读写类型常量:

  • FLAG_GRANT_READ_URI_PERMISSION

  • FLAG_GRANT_WRITE_URI_PERMISSION

或者二者同时授权。这种形式的授权方式,权限有效期截止至发生设备重启或者手动调用 revokeUriPermission() 方法撤销授权时。

第二种方式,配合 Intent 使用。通过 setData() 方法向 intent 对象添加 Content URI。然后使用 setFlags() 或者 addFlags() 方法设置读写权限,可选常量值同上。这种形式的授权方式,权限有效期截止至其它应用所处的堆栈销毁,并且一旦授权给某一个组件后,该应用的其它组件拥有相同的访问权限。

第五步,提供 Content URI 给其它应用

拥有授予权限的 Content URI 后,便可以通过 startActivity() 或者 setResult() 方法启动其他应用并传递授权过的 Content URI 数据。当然,也有其他方式提供服务。

如果你需要一次性传递多个 URI 对象,可以使用 intent 对象提供的 setClipData() 方法,并且 setFlags() 方法设置的权限适用于所有 Content URIs。

常见使用场景

前面介绍的内容都是理论部分,在 开发者官方 FileProvider 部分 都有所介绍。接下来我们看看,实际开发一款应用的过程中,会经常遇见哪些 FileProvider 的使用场景。

自动安装文件

版本更新完成时打开新版本 apk 文件实现自动安装的功能,应该是最常见的使用场景,也是每个应用必备功能之一。常见操作为,通知栏显示下载新版本完毕,用户点击或者监听下载过程自动打开新版本 apk 文件。适配 Android 7.0 版本之前,我们代码可能是这样:

File apkFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "app_sample.apk");

Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
installIntent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
startActivity(installIntent)

现在为了适配 7.0 及以上版本的系统,必须使用 Content URI 代替 File URI。

在 res/xml 目录下新建一个 file_provider_paths.xml 文件(文件名自由定义),并添加子目录路径信息:

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

    <external-files-path name="my_download" path="Download"/>

</paths>

然后在 Manifest 文件中注册 FileProvider 对象,并链接上面的 path 路径文件:

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.yifeng.samples.myprovider"
    android:exported="false"
    android:grantUriPermissions="true">

    <meta-data
        android:name="android.support.FILE_PROVIDER_PATHS"
        android:resource="@xml/file_provider_paths"/>

</provider>

修改 java 代码,根据 File 对象生成 Content URI 对象,并授权访问:

File apkFile = new File(getExternalFilesDir(Environment.DIRECTORY_DOWNLOADS), "app_sample.apk");
Uri apkUri = FileProvider.getUriForFile(this,
        BuildConfig.APPLICATION_ID+".fileProvider", apkFile);

Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
installIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
installIntent.setDataAndType(apkUri, "application/vnd.android.package-archive");
startActivity(installIntent);

好了 有不明白的 及时联系



Android多媒体功能开发(2)——FileProvider 使用系统多媒体界面需要在我们的应用和其他应用之间通过Intent传递音频、图片、视频文件的信息。Android 7及更高版本使用了更严格的文件分享模式,禁止开发人员在应用外部以 “file://”格式的uri分享应用自己目录下的文件,否则会出现 FileUriExposedException 异常。如果需要向其他应用公开应用自己目录下的文件,需要使用FileProvider。 阅读详情

相关推荐

Android FileProvider详细解析和10,GitHub已标星16k

都说三年是程序员的一个坎,能否晋升或者提高自己的核心竞争力,这几年就十分关键。技术发展的这么快,从哪些方面开始学习,才能达到高级工程师水平,最后进阶到Android架构师/技术专家?我总结了这 5大块;我搜集整理过这几年阿里,以及腾讯,字节跳动,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节。

m0_60635176的博客 621

Manifest merger failed : Attribute meta-data#android.support.FILE_PROVIDER_PATHS@resource value=(@xm

之前是这样 <provider android:name="androidx.core.content.FileProvider" android:authorities="${applicationId}.fileprovider" android:exported="false" android:grantUriPermissions="true"> &

丿灬安之若死 2894

Android FileProvider 详解

FileProvider 是 ContentProvider 的一个特殊子类,它可以为应用生成关联的 content:// 内容 URI ,而不是 file:/// 类型的 URI,使得应用能够实现安全地共享文件。 内容 URI 允许授予对文件临时的读/写访问权限。当您构建一个包含内容 URI 的 Intent,并要将包含内容 URI 的 Intent 传递给客户端应用,可以通过 Intent.setFlags() API 添加访问权限。接收 Intent 的客户端应用将获得授予的对文件的访问权限

yingaizhu的博客 3万+

FileProvider 路径配置策略的理解

FileProvider 路径配置策略的理解 ★ FileProvider的使用 在AndroidManifest.xml中 &amp;lt;provider android:name=&quot;android.support.v4.content.FileProvider&quot; android:authorities=&quot;set_your......

Abracadabra的专栏 3万+

Android 适配 - FileProvider

由于篇幅限制,文档的详解资料太全面,细节内容太多,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!由于整个文档比较全面,内容比较多,篇幅不允许,下面以截图方式展示。《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取![外链图片转存中…(img-zbw76SfU-1711773129123)]《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

2401_84008929的博客 1204

Android FileProvider的配置

通常开发中,适配Android7.0主要就是适配其中文件访问权限。比如调用系统拍照,应用更新后安装功能都是涉及到。 在官方7.0的以上的系统中,尝试传递 file://URI可能会触发FileUriExposedException 下面有几种获取方式: ...

qq_40283135的博客 1486

(最新)Android(安卓)FileProvider配置实现文件由其他app(应用)打开或者分享

文章目录一、AndroidManifest.xml文件配置二、编写paths三、intent具体实现四、总结参考资料 最近在做一个安卓app,需要实现对ListView所列的特定后缀的文件进行分享,或者使用其他app打开,通过了解主要方法是使用intent启动其他程序,但是由于android为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问,因此单纯打开文件或者分享文件将报错,需要配置android提供的FileProvider,在配置过程中,参照一些博客,发现都会

恩泽君的博客 5万+

Android中FileProvider的各种应用场景_安卓fileprovider

/测试FileProvider。

2501_90461465的博客 2367

Android之FileProvider详解

文章目录简介目的使用创建FileProvider设置共享目录配置pathsfiles-pathcache-pathexternal-pathexternal-files-pathexternal-cache-pathexternal-media-path生成Content Uri文件授权临时权限Uri传入Intent为邮箱app分享附件文件其他分享 简介 Android 7.0之前,文件的Uri以file:///形式提供给其他app访问。 Android 7.0之后,分享文件的Uri发生了变化。为了安全起见

adojayfan的博客 4万+

高通量测序数据分析:RNA-seq

深度测序相关数据库与数据格式 SRA toolkit 一、NCBI 和EBI、DDBJ组成INSDC,数据内容相同所以找NCBI就行。 (一)NCBI常用数据库 GenBank:遗传序列数据库,收集了所有公开的DNA序列及其注释 GEO (Gene Expression Omnibus) :收集整理各种表达芯片数据,后来加入了甲基化、lncRNA、miRNA、CNV等其他芯片,还有高通量测序数据...

qq_41134363的博客 3万+

从零到英雄:WSL2与Ubuntu22.04的终极性能调优指南

本文详细介绍了如何在Windows系统中通过WSL2与Ubuntu22.04进行性能调优,涵盖内核定制、GPU加速、网络优化等关键技巧,帮助开发者打造媲美原生Linux的高性能开发环境,特别适合AI训练和大数据处理等资源密集型任务。

weixin_29218509的博客 523

安卓使用FileProvider.getUriForFile出现问题解决

安卓使用FileProvider.getUriForFile出现问题解决 一、由于在安卓7.0以上要进行APP的自动升级,需用到FileProvider.getUriForFile方法共享安装包,首先要在AndroidManifest.xml文件中的<application 里面添加如下(在的上一行加):条目 . <provider android:name=“android.supp...

luo13788507590的博客 3万+

机器人抓取(一)—— ROS MoveIt! 程序控制真实UR5机器人运动(python)

接上篇:ubuntu18.04 ros-melodic 安装 ur_robot_driver,驱动真实的 ur5 机器人 上文在 ubuntu 系统中配置了ur 机器人ros功能包 universal_robot 和驱动 Universal_Robots_ROS_Driver,并实现了用 moveit_rviz 拖动机器人运动。本文旨在学习如何使用 moveit python 用户接口moveit_commander,实现真实的ur5 机器人轨迹规划与控制。 1. ur5 机器人控制 参考:MoveIt »

zxxRobot的博客 1万+

Android FileProvider的配置==========

FileProvider是Android 7.0出现的新特性,它是ContentProvider的子类,可以通过创建一个Content URI并赋予临时的文件访问权限来代替File URI实现文件共享 FileProvider注册配置 Manifest中声明FileProvider对象 在 Manifest.xml文件中注册 FileProvider;support库: <manifest> ... <application> ...

清叶 的专栏 5654

金融数字化——详解2025年金融智能体深度应用报告【附全文阅读】

《2025年金融智能体深度应用报告》显示,金融智能体已实现80%部署率,推动行业效率提升30%-50%。报告指出智能体通过"感知-推理-规划-执行-进化"机制突破大模型局限,在风控、客服、投研等100+场景实现自动化。典型案例显示,工商银行信贷审批效率提升60%,蚂蚁数科智能客服解决80%问题。尽管面临系统协同、标准缺失等挑战,未来趋势将向多模态交互、自主进化和ESG投资等方向拓展。

cdfunlove的博客 203

OpenGL ES 3.0 开发(一):绘制一个三角形

该原创文章首发于微信公众号:字节流动 什么是 OpenGLES OpenGLES 全称 OpenGL for Embedded Systems ,是三维图形应用程序接口 OpenGL 的子集,本质上是一个跨编程语言、跨平台的编程接口规范,主要应用于嵌入式设备,如手机、平板等。由科纳斯(Khronos)组织定义和推广,科纳斯是一个图形软硬件行业协会,该协会主要关注图形和多媒体方面的开放标准。 O...

字节流动 8万+

Android FileProvider详细解析和踩坑指南

详细梳理一下android的文件系统,以及做一下FileProvider的解析。

wxz的博客 14万+

用 SemanticObject 把字段变成可点击链接:Fiori Elements Navigation Using a Link 的工程化实践

SAP Fiori elements 通过 Common.SemanticObject 注解可将字段转为可点击链接,实现应用间跳转。当源字段名与目标属性名不一致时,需使用 Common.SemanticObjectMapping 进行映射。该功能依赖 Fiori Launchpad 的目标映射配置,确保正确解析 semantic object + action 并传递参数。常见误区包括未配置目标映射或字段映射错误,需逐一检查语义标注、intent 解析和参数传递链路。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 272

Android FileProvider 实战指南:从配置到安全共享

本文详细介绍了Android FileProvider的配置与安全共享实践,涵盖从基础配置到高级技巧的全流程。通过FileProvider生成content://URI替代不安全的file://URI,有效解决Android 7.0+文件共享的安全隐患,适用于图片分享、APK安装等场景,提升应用安全性。

u5v6w7的博客 977

SOC、SOH、OCV

1)放电实验法的测量SOH结果最为准确,但是深度放电会对影响电池的寿命;2)电阻折算法仅将电阻作为评价SOH的依据,但电池老化时电阻的变化范围较小,因此该方法的误差较大;3)电阻折算法需要对电池进行大量的实验,绘制成Map图,但是该方法有一定的局限性,针对不同的电池需要绘制不同的Map图;4)阻抗分析法是目前最为前沿的方法,可以根据阻抗谱较为直观的分析SOH的变化,但是该方法需要的成本较高,每台设备约为5万美元。

m0_61973119的博客 2万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android N 7.0 应用间共享文件(FileProvider)

Android N 之前的 Uri 常规Uri有两种: 媒体文件的Uri是content://, 表示这是一个数据库数据。去数据库查询正常返回。 其他的文件Uri是file://, 表示这个是一个文件。这个uri是通过Uri.fromFile(File file)方法生成。 Android N 之前,这些uri可以传递到其他应用。 Android N 中共享文件 Android

薛瑄的博客 13万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android-FileProvider-轻松掌握

前言 之前在分析Android 存储相关知识点的时候,有同学提出希望也分析一下FileProvider,那时忙于总结线程并发知识点,并没有立即着手分享。本次,将着重分析Android 应用之间如何使用第三方应用打开文件,如何分享文件给第三方应用。 通过本篇文章,你将了解到: 1、Android 应用间共享文件 2、FileProvider 应用与原理 3、FileProvider Uri构造与解析 1、Android 应用间共享文件 共享基础 提到文件共享,首先想到就是在本地磁盘上存放一个文件,多个应用

3万+

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 微信小程序画布 canvas
下一篇: android 动画
BlueZhang521
博客等级 码龄11年 34粉丝 146原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值