关于 FileProvider(应用间共享文件)的一点总结
在 Android 7.0 ( N ) 以后调用调用相册、照片、安装 APK 等等都会有可能遇到异常 android.os.FileUriExposedException
记得之前有处理过这个问题,今天在安装 APK 时,也遇到以为比较简单,可以快速解决。没想到一天都困在这个 bug 上了(后面讲原因)。经过今天大量的搜索资料,算是系统的学习了一遍这个知识点了吧。
一、在 Android 7.0 以上,对于应用间共享文件做了强制要求。
对于面向 Android N 的应用,Android 框架执行的 StrictMode,API 禁止向您的应用外公开 file://URI。如果一项包含文件 URI 的 Intent 离开您的应用,应用失败,并出现 FileUriExposedException异常。
若要在应用间共享文件,您应发送一项 content://URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。
二、使用方法
- 在 AndroidManifest.xml 中添加 provider
<providerandroid:name="android.support.v4.content.FileProvider"android:authorities="${applicationId}.fileprovider"android:grantUriPermissions="true"android:exported="false"><meta-dataandroid:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/filepaths" /></provider>
- 创建 XML 文件,如:filepaths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android"><root-path name="root" path="" /><files-path name="files" path="." /><cache-path name="cache" path="." /><external-path name="external" path="." /><external-files-path name="name" path="path" /><external-cache-path name="name" path="path" />
</paths>
- files-path :Context.getFilesDir()
- cache-path:getCacheDir()
- external-path:Environment.getExternalStorageDirectory()
参考:
<!-- /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/"/>
其中 path = "." 表示所有的目录。
经过一顿乱写之后,从下午一直到晚上,最后旁边的同事都走完了才发现,原来是在调用跳转的方法和调用跳转的地方不是同一个方法,应该一手封装了一个工具类方便调用,后面维护的同事不知道原本写有了,还把代码复制粘贴原本到那个地方,而且这个还不容易找到。唉,心真累。尤其是修改别人的代码。不过我也粗心,看文档,没看代码导致浪费了很多时间。
Uri 获取需要做判断,我这里是调转安装:
File file = new File(apkPath);Uri uri;if (Build.VERSION.SDK_INT >= 24) {uri = getUriForFile(context, context.getPackageName() + ".fileProvider", file);context.grantUriPermission(context.getPackageName(), uri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION);} else {uri = Uri.fromFile(file);}Intent intent = new Intent(Intent.ACTION_VIEW);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION | Intent.FLAG_GRANT_WRITE_URI_PERMISSION);intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);intent.setDataAndType(uri,"application/vnd.android.package-archive");context.startActivity(intent);android.os.Process.killProcess(android.os.Process.myPid());
ps:最近在集成某语音 SDK 时,遇到一个小坑。
由于内部直接定义了 authorities 并且是写死的,这时会出现安装异常问题了。
Failure [INSTALL_FAILED_CONFLICTING_PROVIDER: Package couldn't be installed in /data/app/com.xxxxx-E4rQAls5E5bmlUawI12PAg==: Can't install because provider name com.xxx.xx.x.mobilesdk.com.xxx.ting.httpclient (in package com.xxx.xx) is already used by com.xxx.xx.x]
因为系统会检测到手机本身已经有了这个 provider 了。所以命名的时候最好是跟随包名变化。
android:authorities="${applicationId}.fileprovider"
关于 FileProvider(应用间共享文件)的一点总结相关推荐
- Android 7.0 行为变更 通过FileProvider在应用间共享文件吧
本文转自张鸿洋的博客 http://blog.csdn.net/lmj623565791/article/details/72859156 一.概述 之前项目的新特性适配工作都是同事在做,一直没有怎么 ...
- android 7.0拷贝文件,Android 7.0应用间共享文件----FileProvider
应用间经常需要将自己的私有文件共享给其他的app,如某应用想要共享图库的图片用来编辑用户的头像,或者文件管理app允许用户在不同目录下复制粘贴文件等等,但为了保护私有文件的安全性,在targetSdk ...
- Android手机WIFI与电脑间共享文件
大家在往手机里传文件的时候是不是还在使用原始的数据线,要不就是使用蓝牙进行传输,数据线传输受到线路和接口的影响,也不是很方便,而且.数据线连接长期使用,易使手机数据口损坏.蓝牙传输又相对较为麻烦,电脑 ...
- Vmware与主机间共享文件的七种方法(附图+详解)
[原创]Vmware与主机间共享文件的七种方法(附图+详解) -By:adbrave 相信很多玩电脑的人都用过Vmware吧?(Vmware是虾米东西?倒!
- docker安装nfs文件服务器,使用docker搭建nfs实现容器间共享文件
首先介绍下今天的两个主角:nfs和docker nfs 是什么 NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TC ...
- VM虚拟机跟主机间共享文件
VM是常用的虚拟机软件,也是我们封装系统的利器.但经常碰到有朋友在坛子里问关于VM和实机之间交互文件的方法,区区不才,使用VM时间也不长,但稍微有一点经验,抛砖引玉,供大家讨论一下.有写错或者不完整的 ...
- linux与windows间共享文件夹 FileZilla树莓派文件传输
参考:linux与windows间的文件共享 作者:丶PURSUING 发布时间:2021-02-09 11:37:48 网址:https://blog.csdn.net/weixin_4474282 ...
- 【转】详细图解Vmware与主机间共享文件的方法
相信很多玩转电脑技术.测试软件的朋友都在用vmare虚拟机吧?可是,好多人都不知道怎么将主机的文件共享给虚拟机,今天,我就结合自己的一些实际经验给大家分享以下七种方法: 测试环境是: 物理机:笔记本 ...
- Vmware与主机间共享文件的七种方法
先是在深度看到的这个帖子,后来又在VMware看到,才发现后者才是原创,觉得不错,拿来分享 原帖作者:adbrave 原帖地址:http://bbs.vmware.cn/viewthread.php? ...
最新文章
- python是什么时候出现的_python什么时候发明的
- oracle pde文件导入
- VUE基本语法1-插值 属性绑定
- SAP CRM IBASE structure的读取逻辑
- 这8种SQL用法,我用错吗?求答案!!!
- pearson相关系数_Pearson(皮尔逊)相关系数
- 清明梦超能力者黄YY、异或树(线段树合并)
- 前端获取当前url路径
- 双向链表逆置c语言,【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)...
- 将S所指的字符串中下标为偶数同时ASCⅡ值为奇数的字符删除,所指串中剩余的字符形成新的串放在t所指的数组中
- TCP / IP攻击:ARP缓存中毒的基本原理、TCP序列号预测和TCP重置攻击
- 大学计算机基础课学几年,大学计算机基础类课程教学(2017年开始)-杭州师范大学计算机教育与.PDF...
- java mvc jquery weui_WEUI 事件绑定
- ArcGIS API For JavaScript——空间查询(FindTask和IdentifyTask)
- 新版本发布潮:Ceylon 1.2、Node.js 5.0和Atom 1.1
- 电商项目java经验_分布式电商系统项目总结
- HCIE-Routing Switching V3.0 资料分享
- python 换页符_python分页字符串
- 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)
- 高德地图API 添加标点 自定义标点