FileProvider文件共享

Android Content URI解析:应对分区存储与厂商文件管理器的兼容性挑战 在Android开发中,文件访问是一个基础且关键的技术环节。随着Android系统权限模型的演进,特别是分区存储(Scoped Storage)的引入,传统的基于绝对路径的文件操作方式发生了根本性变化。其核心原理是通过Content URI机制,将文件访问抽象为基于URI的权限令牌,从而在保障用户隐私安全的前提下,实现跨应用数据共享。这一转变带来了显著的技术价值:应用无需申请宽泛的存储权限即可访问用户授权的特定文件,同时系统能更好地管理文件生命周期。然而,在实际工程实践中,尤其是在处理用户通过系统文件管理器 阅读详情

本文是在查看Android文档关于拍照与文件共享知识,看到关于FileProvider相关内容后,尝试使用并遇到一些问题时决定做的笔记。

一、FileProvider

1.FileProvider的出现

Android7.0之前,使用file://URI通常会给出该文件的全部访问权限,这是不安全的,应该只有应用自己才有权限。在7.0之后,为了更好的保护用户隐私,不再使用file://URI来提供文件的路径,而是使用content://URI。我们常做的功能中,点击头像拍照,就会用到这个方式。在API23之前,使用file://URI是没问题的,但是24之后就会抛出FileUriExposedException。当然,如果你的应用targetSdkVersion小于24,你仍可以使用这个方法,但是作为开发者,不论是出于产品对Android版本的适配,还是从技术学习角度,都要把app做好。

2.FileProvider使用步骤:

1)定义一个FileProvider

一般来说,我们不需要自定义一个FileProvider,因为Android在supportv4库中已经提供了一个android.support.v4.content.FileProvider类,只需要在manifest进行注册。

<application>  
   ...  
   <provider  
        android:name="android.support.v4.content.FileProvider"  
        android:authorities="com.example.android.fileprovider"  
        android:exported="false"  
        android:grantUriPermissions="true">  
        <meta-data  
            android:name="android.support.FILE_PROVIDER_PATHS"  
            android:resource="@xml/file_paths"></meta-data>  
    </provider>  
    ...  
</application> 

authorities为基于包名的权限控制,一般就是自己的包名。exported为false,不需要对外公开此provider。grantUriPermission为true,临时授予获取文件权限。meta-data中的resource指定可生成URI目录的描述文件。

2)指定可以获取的文件

FileProvider只可以对预先指定的文件夹内的文件生成content URI.上面的@xml/file_paths即为指定的目录描述。一般是在res的xml文件夹中定义该文件。名称和上面的resource中的配置一致,该例子就是file_paths.xml。

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <files-path name="my_images" path="images/"/>
    <files-path name="my_docs" path="docs/"/>
</paths>
name为生成的contentURI中的代表指定路径的片段,path为可访问的子目录。如上述配置,生成的目录为:content://com.example.android.fileprovider/my_images/文件名。这里有些东西要着重强调,paths内的元素,files-path有很多替换,但是每个都代表了不同的系统文件夹路径,这些会在下面列出。

3)为文件生成URI

File imagePath = new File(Context.getFilesDir(), "images");
File newFile = new File(imagePath, "default_image.jpg");
Uri contentUri = getUriForFile(getContext(), "com.mydomain.fileprovider", newFile);
之后可以将该URI放在Intent中传递给需要的地方。其他的app可以通过Content.openFileDescription来获取文件描述符。

二、URI生成与匹配遇到的问题

一般来说,主要的问题,在于上面的path与目录的匹配上,匹配不到就会抛出IllegalArgumentException: Failed to find configured root that contains /storage/emulated/0/...等异常。下面列出各种path以及匹配的获取系统目录的api。

<files-path name="name" path="path" />
对应Context.getFilesDir();

<cache-path name="name" path="path" />
对应Context.getCahceDir();
<external-path name="name" path="path" />
对应Environment.getExternalStorageDirectory();

这个着重强调一下,因为还支持Enviroment.getExternalStoragePublicDirectory(String)以及Context.getExternalFilesDir(String)。

举个栗子,比如path设置为“Android/data/com.david.study/files/DCIM”。

Contxt.getExternalFilesDir(Enviroment.DIRECTORY_DCIM)可以直接访问到,也就是可以生成URI,因为其文件夹对应的就是指定的目录;Enviroment.getExternalStoragePublicDirectory(Environment.DCIM)无法访问到,因为其目录已经在指定范围外了。Enviroment.getExternalStorageDirectory()无法直接访问到;

new File(Enviroment.getExternalStorageDirectory(), "Android/data/com.david.study/files/DCIM");可以访问到该目录。

如果path仅仅为“DCIM”,则Environment.getExternalPublicStorageDirectory(Environment.DCIM)可以访问,但Context.getExternalFilesDir(Enviroment.DIRECTORY_DCIM)访问不到,而new File(Enviroment.getExternalStorageDirectory(), "DCIM");也可以访问到。

当path=“”时,这三个任何一个都可以访问到。


听起来很乱,举个具体点的栗子

比如说你配置的filepath为


<?xml version="1.0" encoding="utf-8"?>
    <paths xmlns:android="http://schemas.android.com/apk/res/android">
        <external-path name="my_images" path="Android/data/com.example.app/files/Pictures" />
    </paths>
</xml>


或者


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


或者


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

之后则可以通过getExternalFilesDir(Environment.DIRECTORY_PICTURES);获得到指定的文件夹。注意根节点名称和path的区别。

为何要这么写呢,因为getExternalFilesDir(Environment.DIRECTORY_PICTURES)获取到的目录为Android/data/com.example.app/files/Pictures这个目录因此你在上面的filepath中一点要确保配置的路径能访问到这一层。

分析一下,第一个filepath就不说了,直接指定目录了,完全一致。第二三两个,根节点为external-files-path,对应目录为Android/data/com.example.app/files,只要你指定到files,就可以访问到该目录下所有文件,也包括子文件夹内的东西,当然像第三个还指定了Pictures那就更进一步限制了访问的文件地址。


如果想要访问其他的目录,其实也好处理,可以参考我列出来的几个对应的目录和节点名称,访问对应文件夹。或者要是不知道是哪个目录,你可以先看你用的获取文件夹的方法能访问到哪个目录,之后再来指定其具体的filepath。其实总结起来一句话就是,你用的方法获取的文件夹要和你指定的filepath完全对应,这样才能访问到想要的位置。


<external-files-path name="name" path="path" />
对应Context.getExternalFilesDir(String)或者Context.getExternalFilesDir(null)。

<external-cache-path name="name" path="path" />
对应Context.getExternalCacheDir();

遇到最主要的问题:如果不是对应的目录,会抛出IllegalArgumentException。

解决这个问题的要点是,文件要在该系统目录(files-path等对应的)与path属性对应的目录中。


Android开发实战:content:// URI转文件路径的兼容性处理与避坑指南 在Android开发中,文件访问是常见的需求,涉及文件上传、预览、分享等场景。Android系统基于沙盒安全模型,通过content:// URI机制实现应用间安全的文件共享,而非直接暴露文件系统路径。其核心原理是通过ContentResolver解析URI,获取文件描述符或输入流,从而在严格权限控制下访问文件。这一机制在保障安全的同时,也带来了技术挑战,尤其是在处理不同厂商文件管理器返回的多样化URI格式时。本文聚焦于content:// URI到真实文件路径的转换,深入剖析了Android文件访问框架, 阅读详情

相关推荐

Android WebView安全加载本地文件:file://与content://协议全解析

在移动混合开发中,WebView作为连接原生与Web技术的桥梁,其安全加载本地文件是常见需求。理解浏览器同源策略与Android沙盒安全模型是基础,前者限制不同源脚本间的资源访问,后者则通过文件权限控制保障应用数据隔离。随着Android系统版本升级,安全策略收紧,file://协议在Android 7.0+受限,开发者需转向content://协议并通过FileProvider安全共享文件。然而,content://协议在WebView中会引发JavaScript跨域访问难题,影响本地资源加载与页面功能。

weixin_29192365的博客 5万+

FileProvider共享文件

1.配置fileProvider <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.php.demo.FileProvider" android:exported="false...

qq_36755922的博客 18万+

Android 应用间文件共享:FileProvider 实战指南

本文详细介绍了Android应用间文件共享的FileProvider实战指南,重点解析了如何在私有目录中安全共享文件。通过FileProvider的配置、路径声明及权限控制,开发者可以高效实现应用间文件传输,避免常见的兼容性与安全问题。文章还提供了高级技巧与避坑指南,帮助优化大文件分享体验并确保数据安全。

weixin_29208077的博客 362

Android爬坑之旅之FileProvider(Failed to find configured root that contains)

最近在测试FileProvider相关功能的时候,在从自定义相册选择图片通过FileProvider来获取content uri的时候程序突然崩溃了,报出了 Failed to find configured root that contains xxxx 复制代码的错误,一开始以为是自己的配置出错了,但是参照官方文档改来改去仍然没有任何作用,通过绞尽脑汁地排查,终于发现了错误原因,并找到了正确的...

weixin_34082789的博客 1349

Android FileProvider深度解析:安全文件共享机制与实战指南

在Android应用开发中,安全地共享文件是一个基础且关键的技术需求。其核心原理在于通过内容URI(content://)机制替代传统的文件路径(file://)访问,以实现对应用私有数据的受控访问。这一机制的技术价值在于解决了跨应用文件共享时的安全漏洞,防止未授权应用直接读写敏感数据。在工程实践中,这通常涉及配置FileProvider、定义路径映射以及通过Intent授予临时权限等步骤。典型的应用场景包括调用系统相机拍照保存、安装APK文件以及分享图片到微信等第三方应用。本文聚焦于Android Fil

weixin_29168153的博客 229

RN7302_Demo_V1.1

锐能微电能计量芯片,damo例程。三相计量芯片RN7302。

Android FileProvider 跨进程文件共享示例

Android跨进程文件共享示例 本文演示了使用FileProvider在Android应用间共享文件的三种方式: Activity间文件共享:DemoA通过Intent将文件Uri传递给DemoB的Activity,DemoB可读写该文件。 Activity与Service间共享:DemoA将文件Uri通过Intent传递给DemoB的Service进行文件操作。 Binder服务共享:DemoA通过Binder将文件Uri传递给DemoB的服务端处理。 关键实现步骤包括: 在manifest中声明Fil

Railshiqian的博客 211

vove交易所系统添加平台币自动执行脚本

vove区块链交易所,可以添加目前市面上所有主流币,或是添加发行平台币,并配置自动执行机器人

详解FileProvider的文件共享机制

关于FileProvider文件共享机制及配置共享方法,解决android7.0不能直接获取文件的uri

qq_36273967的博客 6264

微软Media Creation Tool 创建工具 1.3 升级:支持全新下载安装Win11 22H2 Build 22621.525

微软 Media Creation Tool 创建工具 1.3 升级:支持全新下载安装 Win11 22H2 Build 22621.525 ISO 镜像,如果今天运行使用 Media Creation Tool,则会下载 Windows 11 2022 版本 Build 22621.525,它不会向操作系统添加任何新内容,但会修复安装问题,下面来看看详细的更新内容。

zym0218的博客 4223

2025-03-21(DS复习): Databricks 的技术架构

Databricks 的技术架构以 ​为核心,构建了一套高度集成、可扩展且支持多云环境的统一分析平台。其架构设计注重存储与计算的深度融合,并通过丰富的服务层功能简化了数据工程、机器学习和数据科学的工作流。

baidu_24377669的博客 1425

Android安全文件共享终极指南:FileProvider配置与实战

在Android应用开发中,文件共享是一个常见但容易出错的需求。传统使用文件路径URI的方式存在严重安全隐患,可能导致敏感文件被未授权访问。本文基于Android官方培训课程,深入解析FileProvider的安全文件共享机制,提供从基础配置到高级应用的完整解决方案。 ## FileProvider核心价值解析 FileProvider作为Android v4支持库的关键组件,实现了文件访问的

gitblog_00686的博客 3940

汇川PLC用户程序结构详解:如何像搭积木一样配置多任务?附EtherCAT最佳实践

本文深入解析汇川PLC用户程序结构,阐述如何像搭积木一样,通过POU、FB、FC等模块化组件高效配置多任务。文章重点结合EtherCAT通讯场景,分享了任务周期、优先级设置的最佳实践与关键避坑指南,帮助工程师构建稳定、高效的运动控制系统。

weixin_29184075的博客 535

深入解析Android FileProvider:安全文件共享的核心机制

本文深入解析了Android FileProvider的核心机制,它是Android 7.0及以上版本中实现应用间安全文件共享的关键组件。文章通过生动的比喻解释了FileProvider如何用安全的content:// URI替代不安全的file:// URI,并提供了从清单文件配置、路径映射定义到生成URI并授权的完整实践指南。同时,结合拍照、安装APK和分享文件等典型场景,详细说明了其使用方法,并总结了配置冲突、路径错误等常见问题的解决方案,帮助开发者规避陷阱,确保文件共享既安全又高效。

book8的博客 485

c语言面试5(希诺麦田)

在 C 语言中,当使用strlen函数计算字符串的长度时,它会返回字符串中字符的实际个数,不包括字符串结束符’\0’。而sizeof(array)返回的是array指针所占用的字节数,通常在 32 位系统上为 4 个字节,在 64 位系统上为 8 个字节。在给定的代码中,array被初始化为"\0\0",其中包含两个转义字符’\0’。当使用strlen函数计算array的长度时,它会遇到第一个’\0’并停止计数,因此返回的长度为 2。12.下面四个选项是四个整数在内存中的存储情况,其中数值最大的一个是。

Pierce110110的博客 1051

win10 运行lisflood_8踩过的坑

1、安装cuda及VS2019 https://www.bilibili.com/read/cv7335974/ 2、netcdf.h头文件找不到问题 https://www.cnblogs.com/lyggqm/p/12926974.html https://blog.csdn.net/u011954296/article/details/54617048 3、编码问题 https://blog.csdn.net/qq_33485434/article/details/81196843 4、

我的笔记 4112

Android文件共享终极指南:FileProvider安全配置完全解析

在Android应用开发中,文件共享是一个常见但容易出错的技术场景。你是否曾经遇到过因直接使用文件路径URI而导致的权限问题?或者担心敏感文件路径被恶意应用获取?本文将带你深入理解Android FileProvider机制,掌握文件安全分享的核心配置技巧。 ## 为什么需要FileProvider?🚨 传统文件共享方式存在严重安全隐患: 1. **路径暴露风险**:直接使用file://

gitblog_00538的博客 5437

(三)从零开始学习模糊控制——模糊决策

模糊控制之基础——模糊数学 (一)模糊数学——基本概念 (二)模糊数学——模糊关系 (三)模糊数学——模糊决策 文章目录模糊控制之基础——模糊数学前言一、模糊决策法1.最大值原理2.模糊排序2.模糊寻优总结 前言   模糊决策是指在模糊环境下进行决策的数学理论和方法。这类问题─般具有大系统特征,系统之间的关系十分复杂,存在不能准确赋值的变量,这些变量属于模糊因素,涉及到一定的主观因素,使得子系统之间、变量之间的关系不清晰,从而必须借助排序、模糊评判等方法来进行处理。 一、模糊决策

qq_43667552的博客 4748

Android fileProvider 文件共享,进程间通讯

fileProvide共享文件,实现进程间通讯

baidu_29483093的博客 2957

23种设计模式-代理(Proxy)设计模式

软考中级-软件设计师 代理设计模式

片言可决讼,半纸能缚龙 1772

RK3399平台开发系列讲解(内核入门篇)1.1、通过sysfs清楚了解设备的系统状况

文章目录1、不敢高声语,恐惊天上人:sysfs目的2、窥一斑而知全豹:sysfs目录介绍3、千丝万缕:sysfs中要素的关系4、数据观星:sysfs中相关结构体 1、不敢高声语,恐惊天上人:sysfs目的 我们想通过sys下面的目录和文件清楚的了解跑Liunx系统的嵌入式设备的系统状况。 2、窥一斑而知全豹:sysfs目录介绍 sysfs把连接在系统上的设备和总线组织成为一个分级的文件,它们可以由用户空间存取,向用户空间导出内核的数据结构以及它们的属性。sysfs的一个目的就是展示设备驱动模型中各组件.

内核笔记 1万+

Android文件共享终极指南:5步掌握FileProvider安全配置

在Android应用开发中,实现**安全文件分享**是每个开发者必须掌握的技能。通过**FileProvider配置**,我们可以安全地在应用间传输文件,避免直接暴露文件路径带来的安全隐患。本文将详细介绍如何通过5个简单步骤配置Android文件安全传输机制。 ## 为什么需要FileProvider? 传统的文件路径分享方式存在严重的安全风险: - 直接暴露应用内部存储结构 - 无法控制临

gitblog_00995的博客 3055

Camera2Demo

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

Android FileProvider:安全、高效的应用间文件共享解决方案

安全性优先:始终使用FileProvider,避免直接暴露文件路径最小权限原则:只授予必要的读/写权限版本兼容:正确处理Android不同版本的差异性能优化:缓存URI,异步处理大文件错误处理:妥善处理权限异常和ActivityNotFound异常。

2501_93078354的博客 1043

android 蓝牙通讯demo

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

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Android 应用间文件共享:FileProvider 配置与实战指南

本文详细解析了Android应用间文件共享的核心方案FileProvider。针对Android 7.0及以上版本无法直接共享私有目录文件的问题,文章提供了从AndroidManifest.xml配置、创建file_paths.xml定义路径,到生成content:// Uri并安全分享的完整实战指南,帮助开发者实现安全、合规的跨应用文件访问。

vim8coder的博客 443

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Content Provider(二)之 FileProvider 实现应用文件共享

由于Android的安全机制 ,一个进程默认不能影响另外一个进程的,如读取私有数据 。 那么对于进程间的文件的共享 ,出于安全考虑,用FileProvider。FileProvider会基于manifest中的定义定义的一个xml文件(xml目录 下),为所有定义的文件生成content URIs,这样外部的应用在没有权限的情况下,可以通过授予临时权限的content uri,读取相应的文件。

不惜留恋_ 6万+

FileProvider Android7.0 (文件共享,使用系统播放器打开视频等等)

本文整合了下面两文章 1、FileProvider使用 2、android7.0文件共享 前言 Android 7.0,提供了非常多的变化,必须要适配的就是去除项目中传递 file:// 类似格式的 Uri 了 对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在应用外部公开 file:// URI , 如果一项包含文件 URI 的 intent 离开应用,则应用出现故障,并出现 FileUriExposedException 异常 an

T的专栏 2万+
上一篇: Android 多媒体相关
下一篇: Android复制粘贴详解
dapangzao
博客等级 码龄12年 34粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值