Android的FileProvider使用解释

前言

从Android7.0 (N) 开始,严格执行 StrictMode 模式,也就是说,将对安全做更严格的校验。不允许在 App 间,使用 file:// 的方式,传递一个 File ,否则会抛出 FileUriExposedException的错误,会直接引发 Crash。

但是,既然官方对文件的分享做了一个这么强硬的修改(直接抛出异常),那么也提供了解决方案,那就是 FileProvider,通过 content://的模式替换掉 file://,同时,需要开发者主动升级 targetSdkVersion 到 24 才会执行此策略。

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

在app开发过程中需要用到FileProvider的主要有

  1. 相机拍照以及图片裁剪
  2. 调用系统应用安装器安装apk(应用升级)

具体使用的方法

1、配置AndroidManifest文件,声明FileProvider

作用是什么呢?:FileProvider是ContentProvider子类,需要设置一个meta-data,里面指向一个xml文件。

  <provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="${applicationId}.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

authorities:一个标识,在当前系统内必须是唯一值,一般用包名。
exported:表示该 FileProvider 是否需要公开出去。
granUriPermissions:是否允许授权文件的临时访问权限。这里需要,所以是 true。

2、在res的建xml目录,放入provider_paths.xml文件

为什么要写这么个xml文件?
因为要使用content://uri替代file://uri,那么,content://的uri如何定义呢?不能直接使用文件路径。
所以,需要一个虚拟的路径对文件路径进行映射,所以需要编写个xml文件,通过path以及xml节点确定可访问的目录,通过name属性来映射真实的文件路径。

<?xml version="1.0" encoding="utf-8"?>
<paths>
    <external-path
        name="external_storage_root"
        path="." />
    <files-path
        name="files-path"
        path="." />
    <cache-path
        name="cache-path"
        path="." />
    <!--/storage/emulated/0/Android/data/...-->
    <external-files-path
        name="external_file_path"
        path="." />
    <!--代表app 外部存储区域根目录下的文件 Context.getExternalCacheDir目录下的目录-->
    <external-cache-path
        name="external_cache_path"
        path="." />
    <!--配置root-path。这样子可以读取到sd卡和一些应用分身的目录,否则微信分身保存的图片,就会导致 java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/emulated/999/tencent/MicroMsg/WeiXin/export1544062754693.jpg,在小米6的手机上微信分身有这个crash,华为没有
-->
    <root-path
        name="root-path"
        path="" />
/paths>

这个配置的标签参照FileProvider里面的TAG配置。

TAGValuePath
TAG_ROOT_PATHroot-path/
TAG_FILES_PATHfiles-path/data/data/<包名>/files
TAG_CACHE_PATHcache-path/data/data/<包名>/cache
TAG_EXTERNALexternal-path/storage/emulate/0
TAG_EXTERNAL_FILESexternal-files-path/storage/emulate/0/Android/data/<包名>/files
TAG_EXTERNAL_CACHEexternal-cache-path

/storage/emulate/0/Android/data/<包名>/cache

3、使用FileProvider,以安装apk为例:

  	        Intent intent = new Intent(Intent.ACTION_VIEW);
            intent.addCategory(Intent.CATEGORY_DEFAULT);
            Uri uri;
            File file = new File(saveFolder, updateSaveName);
            if (Build.VERSION.SDK_INT >= 24) {//android 7.0以上
                //第二个参数:"app的包名.fileProvider"
                uri = FileProvider.getUriForFile(activity, BuildConfig.APPLICATION_ID.concat(".provider"), file);
            } else {
                uri = Uri.fromFile(file);
            }
            String type = "application/vnd.android.package-archive";
            intent.setDataAndType(uri, type);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            if (Build.VERSION.SDK_INT >= 24) {
                intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
            }
            activity.startActivityForResult(intent, 10);

总结

其实从简单用法就可以看出,Android7.0以上,不能随意就把文件(比如拍照图片)乱甩一个文件路径了。需要在FileProvider规定的几个路径下存放文件,才能生成uri传给另外的组件。就是这个意思。

Jason_Lee155
关注 关注
  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AndroidFileProvider的各种应用场景_安卓fileprovider
2401_84545468的博客
04-29 1077
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图。资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图。,这里放上我搜集整理的。
内涵FileProviderandroid-support-v4包,版本在安卓5.0 sdk
01-24
资源不能选择0分下载了吗?可怕。这是内涵FileProviderandroid-support-v4包,版本在安卓5.0 sdk 内。
Android 11 FileProvider使用和限制
最新发布
qq_34629725的博客
09-12 774
Android 7开始,将不允许在app之间,使用file uri,即file://的方式,传递一个file,否则会抛出异常:FileUriExposedException ,其解决方案,就是使用FileProvider,用content://代替file://,同时需要将targetSdk,升级到24。主要用于系统相机拍照及图片裁剪、应用之间数据访问、应用的升级等。
android 由apk文件安装到FileProvider使用
weixin_44352413的博客
08-19 1万+
主要介绍了android中apk的安装和FileProvider的功能和用法
[Unity安卓开发]Unity3D FileProvider 基础
卡塔部落-老酋长
03-03 7292
FileProvider 专门用于将特定于应用目录中的文件转换为URI,通过 content://Uri 代替 file://Uri 实现不同 App 间的文件安全共享。Android 从 N 开始不允许以 file:// 的方式通过 Intent 在两个 App 之间分享文件FileProvider使用 1.在AndroidManifest.xml中定义provider元素 在application元素中添加provider元素 <provider android:n.
android file getname,Android - 当文件在外部SD上时,FileProvider getUriForFile
weixin_33863049的博客
05-27 350
目前,当文件在外部SD上时,FileProvider getUriForFile方法会生成IllegalArgumentException当文件在设备内存中时(在/ storage/emulated/0下),它可以正常工作.Uri videoUri = FileProvider.getUriForFile(this,getApplicationContext().getPackageName() ...
android学习(十二) 分享文件 FileProvider
yydcnjjw的博客
04-10 2587
分享文件
基于Android FileProvider 属性配置详解及FileProvider多节点问题
08-19
在上面的示例中,根据 Android 版本号来选择不同的实现方式, Android 7.0 及更高版本使用 FileProvider 来共享文件,而 Android 7.0 以下版本使用 Uri.fromFile 来共享文件FileProviderAndroid 7.0 及更高...
android FileProvider
04-23
**Android FileProvider详解** 在Android应用开发中,`FileProvider`是Android SDK提供的一种特殊类型的ContentProvider,主要用于安全地共享应用程序内部或外部存储上的文件。它解决了直接使用`file://` Uri在不同...
一行代码完成Android 7 FileProvider适配
02-16
一行代码完成Android 7 FileProvider适配Demo 通过FileProvider7这个类完成uri的获取即可,例如: FileProvider7.getUriForFile FileProvider7.setIntentDataAndType FileProvider7.setIntentData
安卓使用FileProvider.getUriForFile出现问题解决
luo13788507590的博客
08-06 3万+
安卓使用FileProvider.getUriForFile出现问题解决 一、由于在安卓7.0以上要进行APP的自动升级,需用到FileProvider.getUriForFile方法共享安装包,首先要在AndroidManifest.xml文件中的<application 里面添加如下(在的上一行加):条目 . <provider android:name=“android.supp...
解决android.support.v4.content.FileProvide找不到的问题
01-21
AndroidManifest.xml中加入下面这段话后, <provider android:name=android.support.v4.content.FileProvider android:authorities=com.boxin.forklift.fileprovider android:exported=false android:grantUriPermissions=true> <meta-data android:name=android.support.FILE_PROV
FileProvider实例
11-16
一个简单的fileprovider实例,不依赖任何自定义库实现android7.0以后系统权限申请,使用intent申请相机服务拍照截图,并申请访问系统相册,适合新手参考。
Android7.0 FileUriExposedException、获取文件的URI、FileProvider.getUriForFile空指针错误等
qq_35323561的博客
04-25 1万+
Android7.0 FileUriExposedException / 调用其他应用错误 Android 7.0以上,为了安全,intent不允许直接带有file,要不然会抛出FileUriExposedException 以下是让第三方应用打开ppt文件案例: 一、在AndroidManifest.xml的 中添加provider标签: 这一步主要是设置共享数据的配置,大部分情况采用如下...
AndroidFileProvider详解
热门推荐
adojayfan的博客
09-18 3万+
文章目录简介目的使用创建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发生了变化。为了安全起见
Android FileProvider适配
xiangxiongfly
07-28 376
文章目录FileProvider适配概述基本使用声明provider编写xml文件使用FileProvider FileProvider适配 概述 为了提高私有目录的安全性,防止应用信息的泄漏,从 Android 7.0 开始,应用私有目录的访问权限被做限制。具体表现为,开发人员不能够再简单地通过 file:// URI 访问其他应用的私有目录文件或者让其他应用访问自己的私有目录文件。 同时,也是从 7.0 开始,Android SDK 中的 StrictMode 策略禁止开发人员在应用外部公开 file:
Android FileProvider笔记
moonNife的专栏
09-19 635
通过FileProvider.getUriForFile(@NonNull Context context, @NonNull String authority, @NonNull File file)方法获得一个有临时权限的Uri给客户端用来访问本APP文件。当然看FileProvider类的注释更加详细。
(Android) 7.0文件权限 - FileProvider使用
zl4302647的博客
08-03 2750
如需将应用中的文件提供给其他应用,唯一安全的做法就是向接收方应用发送文件的内容 URI,并授予对该 URI 的临时访问权限。意思是说,为了安全,A应用下的文件正常情况下是不能被B应用使用的,若允许B应用使用,可以给B应用发个uri,B应用根据这个uri去获取文件,但是这个uri是被授予临时访问权限的,B应用临时用一下,权限过期也不可用了。关于7.0文件权限权限问题,网上资料很多,这里是我自己摸索的一点总结,从一个Android初学者的角度阐述,如果你也正在摸索着开发android应用,或许会对你有点帮助。.
Android开发 8.0及以上调用相机/相册,并根据Uri获取图像绝对路径,并进行文件上传
学以致用 知行合一
04-12 4058
之所以要用到provider,是因为从Android7.0开始,就不允许在 App 间,使用 file:// 的方式,传递一个 File ,否则就会抛出异常,而provider的作用恰好就是用过 content://的模式替换掉 file://,看上去只是换了个前缀,但其实是有真实路径转为了虚拟路径。再andorid新版本里面,上面申请了权限之后,还是需要动态在申请权限,所以再需要用到的界面的onCreate方法里面添加如下代码,进行申请。这是一个完整的帮助类,可以基于Uri获取绝对路径。
Android FileProvider配置与多节点问题解决
"基于Android FileProvider 属性配置详解及FileProvider多节点问题" 在Android开发中,FileProvider是一个非常重要的组件,特别是在处理与文件相关的共享和权限管理时。自Android 7.0(API级别24)起,系统对私有...
写文章

热门文章

  • Android的FileProvider使用解释 153941
  • BitLocker恢复获取密钥官方操作指南 71981
  • repo入门和基本用法 28574
  • Java中Calendar.DAY_OF_WEEK、DAY_OF_MONTH需要减一的原因 22860
  • android蓝牙音乐之AVRCP介绍和使用 22258

分类专栏

  • HarmonyOS相关 5篇
  • Android程序 213篇
  • 车联网 14篇
  • Kotlin 26篇
  • SQL操作 6篇
  • 程序算法 112篇
  • github相关 6篇
  • 科普问题与硬件问题 15篇
  • 操作系统 16篇

最新评论

  • 理解操作系统IO多路复用

    Brilliant.Louis: 写的好生动,作者写类比,让我一下子豁然开朗。好文!

  • Android的前台服务

    weixin_41773229: USB ECM属于啥设备,也就是USB网卡,属于那种

  • 微内核是什么?宏内核是什么?一文带你了解操作系统内核架构!

    Sissi�: 外核和多内核怎么没讲捏

  • 从Android的结构看HarmonyOS

    CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性;(2)增加条理清晰的目录。

  • Android媒体播放框架MediaSessionCompat介绍实践

    Jason_Lee155: 需要它给你提供接口才行吧

最新文章

  • OpenHarmony的整编和单编
  • HarmonyOS和OpenHarmony区别联系
  • HarmonyOS开发中几个常见问题
2024年8篇
2023年30篇
2022年58篇
2021年116篇
2020年35篇
2019年69篇
2018年11篇
2017年26篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

玻璃钢生产厂家绍兴玻璃钢长颈鹿雕塑青岛玻璃钢雕塑摆件怎么样农安玻璃钢雕塑工程产品介绍河西商场主题美陈福建佛像玻璃钢雕塑供应商玻璃钢座椅摆件雕塑甘肃玻璃钢仿铜雕塑价格北京佛像玻璃钢雕塑多少钱商场美陈道具价格河南大型商场美陈批发厦门玻璃钢卡通人物雕塑无锡商场美陈布置日照景区玻璃钢雕塑定做青山区商场美陈布展信息推荐aaa订做玻璃钢雕塑红塔区玻璃钢雕塑定做舟山抽象玻璃钢雕塑哪家便宜平平安安玻璃钢雕塑石家庄玻璃钢雕塑鹿玻璃钢雕塑制作教材光盘广东商场美陈生产沛县玻璃钢花盆花器玻璃钢小品雕塑怎么选装饰商场美陈哪家好衢州玻璃钢人物雕塑厂家湛河玻璃钢雕塑价格溧阳商场亮化美陈骑士穿墙玻璃钢雕塑玻璃钢景观雕塑图片大型商场创意商业美陈报价香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化