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万+

私有云平台搭建——OpenStack

私有云平台搭建——OpenStack 搭建过程

2301_79739036的博客 3090

【清风数学建模笔记】第十一讲:时间序列分析

【清风数学建模笔记】第十一讲:时间序列分析

manerzi的博客 832

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

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

luo13788507590的博客 3万+

手把手教你玩转CPU微架构专栏--​​​​第二章:流水线——微架构的“效率引擎”​​​​2.4 超标量与超线程:如何突破“单指令流”的限制?

例如,Intel酷睿i5-13600K拥有6个性能核(P核,支持超线程,共12线程)和8个能效核(E核,无超线程,共8线程),兼顾多线程性能与能效比。通过引入“物理寄存器”替代“逻辑寄存器”(如x86的RAX、RBX),消除数据冒险中的“假依赖”(False Dependency)。引入“混合架构”(Performance Core+Efficient Core),大核(P核)专注高性能任务,小核(E核)处理后台任务;​:6发射超标量,IPC≈3.5(通过3D V-Cache优化缓存,进一步提升效率)。

xiaoheshang_123的博客 955

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

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

清叶 的专栏 5654

实测昇腾310P跑Qwen3有多慢?手把手带你部署vLLM并记录性能数据

本文实测了昇腾310P在vLLM框架下部署Qwen3模型的性能表现,详细记录了2.5 tokens/s的生成速度及其技术瓶颈。通过环境搭建、基准测试和深度分析,揭示了计算资源利用率不足等关键问题,并提供了实用的优化技巧与监控方案,帮助开发者更好地理解和优化昇腾平台上的大模型部署。

weixin_28724319的博客 895

Docker容器化部署Ceph集群:从零搭建高可用分布式存储

本文详细介绍了如何使用Docker容器化部署Ceph集群,从零搭建高可用分布式存储系统。通过环境一致性、快速扩容和资源隔离等优势,Docker显著提升了Ceph集群的部署效率和运维便捷性。文章涵盖硬件规划、镜像选择、单节点部署、多节点扩展及性能调优等实战内容,帮助开发者快速掌握分布式存储系统的容器化部署技巧。

weixin_29081101的博客 422

Android FileProvider详细解析和踩坑指南

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

wxz的博客 14万+

解决anaconda占用C盘空间过多问题

anaconda就算安装在其他盘,默认会把索引、锁定文件、压缩包等都放到系统盘(C盘),我用了两年,占用30GB。 1. 卸载不用的虚拟环境 查看已安装的虚拟环境 conda env list 卸载不用的、过期的虚拟环境 conda remove -n (要卸载的环境的名字) --all 2. 删除索引缓存、锁定文件、未使用过的包和tar包 conda clean -a 清理完之后,删除了15GB,还剩15GB,舒服了 ...

沉迷单车的追风少年 3万+

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

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

u5v6w7的博客 977

实测可复现|2026 Cloudflare盾v4.0反反爬全实战:从JS/WASM逆向到JA3指纹伪装,手把手突破拦截(附完整逆向代码+避坑手册)

本文以2026年Cloudflare盾v4.0(集成Shield Synapse v2.0)为核心,全程以实战复盘为视角,拆解了从JS/WASM混合逆向、全维度指纹伪装(JA3+浏览器指纹)、人类行为模拟,到代理池搭建的全流程,整合了完整可复现的代码,所有步骤和踩坑点均为实测所得,无任何AI套话,新手也能跟着复现,最终实现爬取成功率从12%提升至95%+。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1686

基于知识图谱的时空事件关联推理能力培养

随着信息技术的飞速发展,大量的时空事件数据被产生和收集,如交通流量数据、气象观测数据、社交媒体上的地理定位信息等。这些数据蕴含着丰富的知识和规律,但要从中提取有价值的信息并非易事。基于知识图谱的时空事件关联推理旨在通过构建知识图谱,将时空事件数据进行整合和关联,从而实现对事件之间潜在关系的挖掘和推理。本文的目的是系统地介绍基于知识图谱的时空事件关联推理能力的培养方法,包括核心概念、算法原理、数学模型、实际应用等方面。

操作系统内核探秘的博客 750

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万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Android-FileProvider-轻松掌握

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

3万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

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

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值