android 7.0 因为Uri.fromFile引起的FileUriExposedException异常
来源:互联网 发布:手机淘宝链接转换器 编辑:程序博客网 时间:2024/06/06 00:48
最近作者又碰到因为android 7.0 引起的兼容问题了。
在7.0以前的版本:
//创建临时图片File photoOutputFile = SDPath.getFile("temp.jpg", SDPath.PHOTO_FILE_STR);Uri photoOutputUri = Uri.fromFile(photoOutputFile);
这个file文件直接非常简单的转换成"file://XXX/XXX/XXX"的uri格式
7.0后的版本:
当把targetSdkVersion指定成24及之上并且在API>=24的设备上运行时。这种方式则会出现FileUriExposedException异常
android.os.FileUriExposedException: file:///XXX exposed beyond app through ClipData.Item.getUri() at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799) at android.net.Uri.checkFileUriExposed(Uri.java:2346) at android.content.ClipData.prepareToLeaveProcess(ClipData.java:832) at android.content.Intent.prepareToLeaveProcess(Intent.java:8909) ...
原因
Android不再允许在app中把file://Uri暴露给其他app,包括但不局限于通过Intent或ClipData 等方法。
原因在于使用file://Uri会有一些风险,比如:
- 文件是私有的,接收
file://Uri
的app无法访问该文件。 - 在Android6.0之后引入运行时权限,如果接收file://Uri的app没有申请
READ_EXTERNAL_STORAGE
权限,在读取文件时会引发崩溃。
因此,google提供了FileProvider
,使用它可以生成content://Uri
来替代file://Uri
。
解决方案
第一步、
在AndroidManifest.xml中加上摄像头、读写磁盘的权限,如下
第二步、
在AndroidManifest.xml中加上自定义权限的ContentProvider,如下
第三步、
在项目res目录下创建一个xml文件夹,里面创建一个file_paths.xml文件,上一步定义的什么名称,这里就什么名称,如图:
好了,基本工作准备好,下面开始具体的使用吧
1、调用系统相机
2、调用系统播放器播放视频3、切图4、用系统安装器安装APK
我所碰到的异常
1、java.lang.SecurityException: Provider must not be exported
解决方案:android:exported
必须设置成false
2、Attempt to invoke virtual method 'android.content.res.XmlResourceParser android.content.pm.PackageItemInfo.loadXmlMetaData(android.content.pm.PackageManager, java.lang.String)' on a null object reference
解决方案:AndroidManifest.xml
处的android:authorities
必须跟mActivity.getPackageName() + ".fileprovider"
一样
此文章是我在使用过程中遇到问题时所搜到的,并且把两篇文章的重要部分综合了一下,方便遇到同样的问题能快速的处理。如果大家在使用的过程中还有遇到其他的 问题以及解决办法,欢迎留言。我把这两篇文章的原稿地址留在下面;
http://blog.csdn.net/msn465780/article/details/59058088?locationNum=8&fps=1;
http://www.jianshu.com/p/55b817530fa3;
- android 7.0 因为Uri.fromFile引起的FileUriExposedException异常
- android 7.0 因为file://引起的FileUriExposedException异常
- Android 7.0 报android.os.FileUriExposedException异常
- Android N及以上使用Uri的报FileUriExposedException问题
- Android N FileUriExposedException异常
- 【随心笔录】Android N 文件Uri传递,报出FileUriExposedException异常,使用FileProvider
- Android笔记:解决Android 7.0 FileUriExposedException url异常
- Android 7.0拍照出现android.os.FileUriExposedException异常
- Android笔记:解决Android 7.0 FileUriExposedException url异常
- android 7.0的android.os.FileUriExposedException: 问题解决
- 安卓7.0 Uri.fromFile(file)报错随笔
- Android 7.0 FileUriExposedException 解决
- Android 7.0 FileUriExposedException 解决
- Android 7.0 FileUriExposedException 解决
- Android 7.0 拍照 FileUriExposedException
- Android 7.0 FileUriExposedException 解决
- Android 7.0 FileUriExposedException 解决
- Android 7.0 android.os.FileUriExposedException
- redis 节点删除
- tensorflow的学习(第二篇)
- 如何使用Charles抓包并分析Http报文
- java synchronized关键字的用法以及锁的等级:方法锁、对象锁、类锁
- vue表单自定义校验规则
- android 7.0 因为Uri.fromFile引起的FileUriExposedException异常
- Win7 BitLocker加密须了解的五件事
- Android消息循环机制
- 并发操作子线程
- spaarkr 的使用
- Bayesian Network
- (1)、JEasyUI 之 Datagrid的Combobox 显示 textField 值的问题
- [日推荐] 『好奇心日报』满足你所有的好奇心
- Robotframework(2):创建RF第一条可执行的用例