使用FileProvider 分享文件

FileProvider使用 前言 Android 7.0,提供了非常多的变化,不过必须要适配的就是去除项目中传递 file:// 类似格式的 Uri 了 对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在应用外部公开 file:// URI , 如果一项包含文件 URI 的 intent 离开应用,则应用出现故障,并出现 FileUriExposedExceptio... 阅读详情

起因

我们的截图应用在Android O 上使用分享功能的时候crash了,错误关键词:FileUriExposedException。
Google 一下发现这个问题从Android N 开始出现的,当你给使用 file:/// Uri 分享文件的时候会抛出这个异常。
但是奇怪的是我们在Android N 上使用分享功能的时候并没有出现问题,不管怎样有问题就要解决。
一句话概括,我们要做的就是使用 content:// Uri 代替 file:/// Uri。

解决过程

报错代码:

    public void shareScreenshot() {
        final File imageFile = new File(mScreenshotPath);
        // Create a shareScreenshot intent
        Intent sharingIntent = new Intent(Intent.ACTION_SEND);
        sharingIntent.setType("image/png");
        sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
        startActivity(Intent.createChooser(sharingIntent, getResources().getText(R.string.share)));
    }

当我们使用Uri.fromFile(imageFile)的时候获得了 file:/// Uri,就是使用这个 file:/// Uri 的时候报的错。
下面我们分几步把file:/// Uri 替换成 content:// Uri。

  1. 指定FileProvider
    在AndroidManifest.xml 中定义FileProvider。
    关注两个值,android:authorities 和android:resource,前者是包名跟.fileprovider, 后者是定义你想要访问的目录的文件,下面会细说。

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
       package="com.example.myapp">
       <application
           ...>
           <provider
               android:name="android.support.v4.content.FileProvider"
               android:authorities="com.ckt.screenshot.provider"
               android:grantUriPermissions="true"
               android:exported="false">
               <meta-data
                   android:name="android.support.FILE_PROVIDER_PATHS"
                   android:resource="@xml/provider_paths"/>
           </provider>
           ...
       </application>
    </manifest>
  2. 指定可共享的目录
    在res/xml/创建和上面android:resource 对应的文件provider_paths.xml。

    <paths>
       <files-path path="images/" name="myimages" /> <!--仅作举例-->
       <external-path name="external_files" path="Pictures/Screenshots/"/>
    </paths>

    在这个例子中files-path 标签代表了应用内部存储files/子目录下的文件, external-path 标签代表外置存储根目录。其他标签请查看FileProvider 介绍。

    • path 代表的是子目录。它是标签代表的目录的子目录。比如上例中的两个目录,第一个是应用内部存储files/下的images/ 子目录,另一个是存储卡根目录下的Pictures/Screenshots/ 子目录。
      注意: 不能用指定文件名的方式分享特定文件,也不能用通配符的方式指定一些文件。
    • name 是content Uri 中的一段,它可以说是path的别名,为了加强安全性,用name的值代替实际的path 路径添加到content Uri中;
  3. 修改java 代码
    使用FileProvider.getUriForFile 获得content Uri。

    +        Uri imageUri = FileProvider.getUriForFile(mContext,
    +                BuildConfig.APPLICATION_ID + ".provider",
    +                imageFile);
            // Create a shareScreenshot intent
            Intent sharingIntent = new Intent(Intent.ACTION_SEND);
            sharingIntent.setType("image/png");
    -        sharingIntent.putExtra(Intent.EXTRA_STREAM, Uri.fromFile(imageFile));
    +        sharingIntent.putExtra(Intent.EXTRA_STREAM, imageUri);

    实际文件路径 imageFile /storage/emulated/0/Pictures/Screenshots/Screenshot_20180224-104038.png
    而我们获得 imageUri content://com.ckt.screenshot.provider/external_files/Screenshot_20180224-104038.png

    结合provider_paths.xml 对比可以看出Pictures/Screenshots(path 实际路径)替换成了external_files(name 别名)。

不使用Uri.fromFile() 的几点理由

  • Does not allow file sharing across profiles.
  • 要求分享文件的应用有WRITE_EXTERNAL_STORAGE 的权限(Android 4.4 及以下)
  • 要求接收文件的应用有 READ_EXTERNAL_STORAGE的权限,分享文件给没有这些权限的应用会失败,比如Gmail就没有这个权限。
    最重要的一点,在Android N及以上会出现Crash。

参考连接

  1. FileUriExposedException
  2. FileProvider
  3. Setting Up File Sharing
  4. android.os.FileUriExposedException: file:///storage/emulated/0/test.txt exposed beyond app through Intent.getData()
  5. 解决 Android N 7.0 上 报错:android.os.FileUriExposedException
Android系统应用与非系统应用FileProvider共享文件避坑指南(附UID 1000解决方案) 本文详细解析了Android系统应用(UID 1000)与非系统应用通过FileProvider共享文件时常见的'Permission Denial'错误,提供了UID统一方案、替代共享方案及系统源码修改方案等实用解决方案,帮助开发者高效规避文件共享中的权限问题。 阅读详情

相关推荐

Android app分享文件到微信

两种实现方案: 1.使用WXFileObject构造分享方法发送到微信; 2.调用系统分享方法,把文件直接发送到微信; 那么下面来分别看看怎么实现: 〇、准备工作 首先,需要在AndroidManifest.xml中配置FileProvider信息,以适配10以后版本文件读取问题 AndroidManifest.xml <provider android:name="androidx.core.content.FileProvider" andr

椰子的博客 8953

利用FileProvider建立文件分享

app经常需要给其他的app传送文件,比如QQ里面我们可能需要将图库里面的图片返回,比如图片浏览器想把图片文件传到图片编辑器中,或者文件管理器想让用户在external storage中复制粘贴文件。为了将文件安全地从我们的应用程序共享给其它应用程序,唯一一种安全的方法就是将文件的URI传输给目标应用并授予该URI临时权限. 因为这权限是对于接收URI的目标应用有效,并且是临时的,会自动失效,所以这

jxq1994的博客 1万+

FileProvider 选择文件适配

FileProvider api>17,为了安全考虑,进程间文件不能直接通过file://传递,android官方使用content:// 代替,因此我们需要重新构造content://开头的Uri。 implement contentProvider,跨进程间,分享文件 Uri 此处主要讲解自定义Uri,系统Uri由用处类型不同,酌情考虑 Uri 格式主要四元素 : scheme://authority/path?query 分享文件路径解析: ** content

m.t.u 1192

友盟分享集成适配Android11--解决Android11需要FileProvider方式分享问题

#友盟分享集成适配Android11–解决Android11需要FileProvider方式分享问题 项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述: 提示:这里描述项目中遇到的问题: 例如:数据传输过程中数据不时出现丢失的情况,偶尔会丢失一部分数据 APP 中接收数据代码: @Override public void run() { bytes =

h.f的博客 5116

手把手教你排查Abaqus中的Johnson-Cook损伤参数:避免因d3正负号导致的仿真失败

本文详细解析了Abaqus中Johnson-Cook损伤参数d3正负号设置的关键问题,帮助用户避免因参数错误导致的仿真失败和Excessive distortion报错。通过对比不同文献定义、提供实操指南和典型错误排查流程,有效提升非线性分析的准确性和效率。

weixin_33960567的博客 355

CODESYS安装全攻略:从下载到配置的保姆级教程(含常见问题解决)

本文提供了一份详细的CODESYS安装与配置指南,涵盖从系统环境准备、安装包下载、Development System安装到Runtime System配置的全过程。教程重点解决了安装过程中的常见权限、兼容性和连接问题,并指导用户完成第一个PLC程序的创建与调试,帮助工业自动化开发者快速上手这一通用开发平台。

kkk56的博客 421

解决Android11上分享图片失败

解决Android11上分享图片失败 1.先分析问题原因 ​ 首先分享应用数据给第三方应用需要在用到文件共享,就需要在AndroidManifest.xml中配置FileProvider,但是配置了只代表你可以使用FileProvider存储了应用间共享文件,但是在并不代表你使用了FileProvider(后边会讲怎么使用)。 ​ 从 Android 11 开始,使用 分区存储模式 的应用即使拥有 READ_EXTERNAL_STORAGE 权限,也无法再访问外部存储中的任何其他应用的 专属目录 中的文

weixin_42169702的博客 4万+

2026 AI编程环境安装指南:从下载、部署到流式验证

AI编程环境已不再是传统软件安装,而是融合硬件兼容性、模型运行时与IDE插件协同的系统工程。其核心原理在于:本地GPU驱动需匹配量化运行时(如Ollama v0.3+对CUDA 12.1+的强制要求),协议层依赖gRPC流式响应,生态层则要求插件签名与模型源可信校验。这一技术组合显著提升AI代码生成的实时性与生产就绪度,支撑微服务开发、CI/CD智能补全、本地LLM推理等关键场景。本文聚焦AI编程软件下载与安装过程中的可复现部署实践,覆盖macOS/WSL2双平台、NVMe模型加速、离线校验及原子化功能验证

weixin_30480075的博客 586

使用Android系统自带文件分享功能(FileProvider)

确保 FileProvider 路径配置正确,且文件存在。

qq_44780769的博客 1798

大语言模型(LLM)在组合优化中的新突破:LLM-LNS与FunSearch性能对比

本文深入探讨了大语言模型(LLM)在组合优化中的创新应用,重点对比了LLM-LNS与FunSearch两种方法的性能差异。研究表明,LLM-LNS在物流路径规划、资源调度等场景中展现出显著优势,其双层自演化架构能有效平衡探索与利用,相比传统方法提升效率约43%。文章还提供了实践选择指南,帮助开发者根据具体需求选用合适的技术方案。

weixin_42526415的博客 406

2026年软件测试职业院校技能大赛—ERP管理平台-采购入库模块Bug定位与查找

竞赛对接软件测试相关标准,以“ERP管理平台” 为被测系统,围绕软件测试领域的主流技术及工具,考查选手面 对实际问题的综合分析能力,对测试文档、测试用例的设计能力, 对单元测试、自动化测试、性能测试、接口测试等测试工具及方 法的掌握程度,检验选手团队协作能力、组织规划能力、方法运用能力等。

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 195

Android安全文件分享终极指南:如何正确使用FileProvider

在Android应用开发中,安全地分享文件给其他应用是一个常见需求。本文将深入讲解如何通过FileProvider组件实现安全的文件分享机制,帮助开发者避免常见的权限和安全问题。 ## 为什么需要FileProvider? 传统的文件路径分享方式存在严重的安全隐患。当直接使用文件路径URI时,接收方应用可能会访问到超出预期的文件或目录。FileProvider通过生成Content URI来替

gitblog_01085的博客 2124

YOLOv11改进策略【卷积层】| SPD-Conv 针对小目标和低分辨率图像的检测任务

SPD-Conv是一种新的 CNN 构建模块,用于替代传统 CNN 架构中使用的步长卷积(strided convolution)和池化(pooling)层,它由空间到深度(Space-to-depth,SPD)层和非步长卷积(non - strided convolution)层组成。

Limiiiing的博客 4976

android 分享文件到应用,如何使用支持FileProvider将内容分享给其他应用程序?

从OS 4.4开始,此解决方案适用于我。为了使其适用于所有设备,我为旧设备添加了一种解决方法。这确保始终使用最安全的解决方案。的Manifest.xml:android:name="android.support.v4.content.FileProvider"android:authorities="com.package.name.fileprovider"android:exported="...

weixin_28782251的博客 873

SAP-ABAP:SAP数据库视图的创建图文详解

在“短文本”字段中输入视图的描述。在“表/视图”字段中输入要基于的表名。如果视图基于多个表,可以在这里输入主表。点击“表/视图字段”按钮,选择要包含在视图中的字段。如果视图基于多个表,点击“关系”按钮来定义表之间的连接条件。在弹出的窗口中,选择要连接的表,并定义连接条件(例如。

baidu_35680696的博客 973

华为OD机试双机位C卷 - 比赛 / 评委评分 (C++ & Python & JAVA & JS & GO)

华为OD机试双机位C卷 比赛,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试-比赛,华为OD机考-比赛。

qq_45776114的博客 1701

FileProvider小记

官方地址:FileProvider FileProvider是ContentProvider的特殊子类,可以安全的分享文件通过创建content:// Uri来替代file:/// Uri。 使用步骤 This overview of FileProvider includes the following topics: manifest配置FileProvider 指定paths路...

momo_ibeike的博客 464

android 蓝牙通讯demo

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

android打开与分享文件

创建fileProvider <application>//放在application中 <provider android:name="androidx.core.content.FileProvider" android:authorities="com.h3c.sharedemo.fileprovider" android:exported="false" a.

楠之枫雪的博客 3586

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

如何分享一个文件

public class FileProviderExample extends Activity {     private static final String AUTHORITY = "com.example.android.supportv4.my_files";     @Override     protected void onCreate(Bundle savedI

lyglostangel的专栏 523

Android开发之FileProvider

最近做项目时,都需要用到FileProvider。于是就研究了下,现总结如下: 官方路径:http://developer.android.com/intl/zh-cn/training/secure-file-sharing/setup-sharing.html 比如短信要分享一张图片到蓝牙,需要做的就是在短信中设置如下: 首先,需要在 Menifest里添加 prov...

weixin_30902675的博客 570

根据 Android Training课程写的FileProvider小例子

FileProvider的使用   一个应用经常需要向其他应用发送一个甚至多个文件。例如,一个图库应用可能需要向图片编辑器提供多个文件,或者一个文件管理器可能希望允许用户在外部存储的不同区域之间复制粘贴文件。一种让应用可以分享文件的方法,接收文件应用所发出的请求进行响应。   在所有情况下,唯一的一个将一个文件从你的应用发送至另一个应用的安全方法是向接收文件应用发送这个文件的URI,然后对

夏商周 6972

fileprovider方式分享_FileProvider 在 Android N 上的应用

作者:才华横溢的段老师 蓝田大营一、背景Android 从 N 开始不允许以 file:// 的方式通过 Intent 在两个 App 之间分享文件,取而代之的是通过 FileProvider 生成 content://Uri 。如果在 Android N 以上的版本继续使用 file:// 的方式分享文件,则系统会直接抛出异常,导致 App 出现 Crash ,同时会报以下错误日志:28905 ...

weixin_39869733的博客 2828

Androud开发实践:用FileProvider解决文件分享适配问题

本文详细讲解了Android 7.0+系统中使用FileProvider实现安全文件分享的方法。由于系统安全限制,传统file://URI方式已被禁用,必须改用FileProvider生成content://URI。文章涵盖三大方面:1)配置FileProvider(清单文件和路径定义);2)核心代码实现(纯文本与图片分享);3)关键技术点(权限控制、Android10+适配)。通过FileProvider既能隐藏文件真实路径,又能实现跨应用安全共享,是Android开发的必备技能。文末还提供了多文件分享、

m0_65371943的博客 1374

Android 7.0配置fileprovider共享文件 解决FileUriExposedException

一.前言 从 Android N(7.0) 开始,将严格执行 StrictMode 模式,也就是说,将对安全做更严格的校验。而从 Android N 开始,将不允许在 App 间,使用 file:// 的方式,传递一个 File ,否者会抛出 FileUriExposedException 的错误,会直接引发 Crash。 去找(www.7zhao.net欢迎您 但是,既然官方对文件的

qq_38208201的博客 1万+

Android的FileProvider使用解释

FileProvider是android support v4包提供的,是ContentProvider的子类,便于将自己app的数据提供给其他app访问。

Jason_Lee155的博客 19万+
上一篇: Wireless Emergency Alerts 介绍(CMAS介绍)
下一篇: Android L无法接听/拒接来电现象的分析与解决(文末对比Android M)
十橙
博客等级 码龄24年 312粉丝 95原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值