使用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

abaqus2matlab的安装与使用:如何用matlab提取abaqus的odb结果

官网abaqus2matlab官网地址matlab社区地址matlab社区地址在这里可以看到.m文件的源码论文:Abaqus2Matlab: A suitable tool for finite element post-processingabaqus2matlab可以处理.inp、.fil、.odb三种类型的文件。.inp文件:处理功能就在于只是单纯的输出inp文件,由于我自己写了自己的函数,不需要用到这个功能。

qianxin1234的博客 2019

别再死记硬背参数了!手把手教你用Fluent欧拉模型搞定流化床模拟(附颗粒粘度/体积分数设置详解)

本文深入解析Fluent欧拉模型在流化床模拟中的应用,重点讲解颗粒粘度和体积分数等关键参数的设置原理与科学方法。通过对比不同模型(如Syamlal-O'Brien、Gidaspow)的适用场景,帮助工程师摆脱参数死记硬背,实现精准模拟。内容涵盖相间作用机制、求解策略优化及结果验证,为化工、能源领域的流化床模拟提供实用指南。

weixin_42656416的博客 429

解决Android11上分享图片失败

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

weixin_42169702的博客 4万+

Java服务端实现Google Pay支付功能

全网最全代码、最清晰服务端处理Google Pay,最清晰讲解Google Pay集成逻辑。

jack2350536098的博客 1万+

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

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

qq_44780769的博客 1798

【开源】基于TI ADS1299与ESP32的8通道脑电采集设备YuEEG全解析

本文详细解析了基于TI ADS1299芯片与ESP32主控的开源8通道脑电采集设备YuEEG。内容涵盖硬件设计、固件驱动开发及Python上位机软件实现,提供了从电路连接、SPI通信配置到数据读取与实时波形显示的全套教程。该项目为学习脑机接口(BCI)与高精度生物电信号采集提供了完整的开源解决方案,适合创客、学生及嵌入式开发者实践。

weixin_42576410的博客 1248

window下安装并使用nvm(含卸载node、卸载nvm、全局安装npm)

文章目录一、卸载node二、安装nvm三、配置路径和下载源四、使用nvm安装node五、nvm常用命令六、卸载nvm七、遇到的问题 nvm 全名 node.js version management,顾名思义是一个nodejs的版本管理工具。通过它可以安装和切换不同版本的nodejs。 一、卸载node 如果你已经安装了node,那么你需要先卸载node,如果你没有安装那直接跳过这一步到下一步。 打开控制面板 -> 打开程序和功能 -> 右上角搜索输入node -> 右键卸载 为了确保彻底

HuangsTing的博客 41万+

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

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

gitblog_01085的博客 2124

CTF入门RSA维纳攻击

RSA维纳攻击 一.题目描述 适用于e过大或国过小情况下的RSA加密 题干如下: #coding:utf-8 import gmpy2 import libnum e = 54856417509806712596137531985117125938559627187663765776152288580865785539464797248184444737659643755765127505761012086539564616967122137525108154121304264697865568653100

noj_h的博客 2232

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

FastAPI 高级特性:同异步路由函数、依赖注入与后台任务

在现代 Web 开发中,高效的性能和简洁的代码结构是至关重要的。FastAPI 作为一个现代、快速(高性能)的 Web 框架,凭借其对异步编程的原生支持和直观的依赖注入系统,迅速成为开发者的热门选择。在本文中,将深入探讨 `FastAPI` 中的几个核心概念:同异步函数的区别、`Depends` 依赖以及后台任务。

qq_43629857的博客 203

32、生物信息学中的符号、缩写及相关概念解析

本文详细解析了生物信息学中常用的符号、缩写及相关概念,涵盖概率理论、函数表示、模型结构、图与集合、维度参数、神经网络、隐藏马尔可夫模型、双向架构、语法系统、系统发育树、微阵列分析以及核方法与支持向量机等多个领域。通过表格和mermaid流程图的形式,系统梳理了各类符号的定义与应用场景,并介绍了常见缩写的全称与意义。文章旨在帮助研究人员准确理解生物信息学中的基础术语,提升对基因表达分析、序列建模、机器学习等技术的理解与应用能力。

rrr55的博客 146

FileProvider小记

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

momo_ibeike的博客 464

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

android打开与分享文件

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

楠之枫雪的博客 3586

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

VB摄像头监控

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

如何分享一个文件

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

lyglostangel的专栏 523

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

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

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、付费专栏及课程。

余额充值