[转]快速使用FileProvider解决Android7.0文件权限问题

 

升级到Android7.0之后,启动系统相机或者截图,传入URI的时候可能会导致程序闪退崩溃。这是因为7.0的新的文件权限导致的。下面是解决这个问题的快速解决方案。

 

问题代码

 

在7.0可能会出问题的代码:

 

final String CACHE_IMG = Environment.getExternalStorageDirectory()+"/demo/"
final int TAG_PHOTO_CAMERA=200;Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);String fileName = "defaultImage.jpg";File file = new File(CACHE_IMG, fileName);Uri uri = Uri.fromFile(file);intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);startActivityForResult(intent, TAG_PHOTO_CAMERA);

 

其中Uri uri = Uri.fromFile(file);这里会导致闪退。

 

解决方法

 

step1. 将Uri的生成方式改为由FileProvider提供的临时授权路径,并且在intent中添加flag
修改后代码如下

 

final String CACHE_IMG = Environment.getExternalStorageDirectory()+"/demo/"
final int TAG_PHOTO_CAMERA=200;Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);String fileName = "defaultImage.jpg";File file = new File(CACHE_IMG, fileName);Uri imageUri=FileProvider.getUriForFile(activity,"me.xifengwanzhao.fileprovider", file);//这里进行替换uri的获得方式intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//这里加入flagstartActivityForResult(intent, TAG_PHOTO_CAMERA);

 

step2.在AndroidManifest.xml中的application标签中添加provider的配置

 

   <application
       ...><provider
            android:name="android.support.v4.content.FileProvider"android:authorities="me.xifengwanzhao.fileprovider"//这里需要和上面部分字符串相同android:exported="false"android:grantUriPermissions="true"><meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"android:resource="@xml/file_paths" /></provider></application>

 

step3.在res/xml中新建一个文件file_paths.xml

 

<?xml version="1.0" encoding="utf-8"?>
<resource xmlns:android="http://schemas.android.com/apk/res/android"><external-path
        name="images"path="demo/" />
</resource>

 

OK,大功告成,这样就不会崩溃了

 

代码解释

 

我们先看Google官方的7.0行为变更介绍 (不需要翻墙)

 

对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。

要在应用间共享文件,您应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。如需了解有关权限和共享文件的详细信息,请参阅共享文件。

 

根据文档提示我们使用FileProvider进行处理,同时利用xml对FileProvider进行配置
参考如下

 

java根路径产生方式对应xml根节点名称
Context.getFilesDir()files-path
getCacheDir()cache-path
Environment.getExternalStorageDirectory()external-path
Context#getExternalFilesDir(String) Context.getExternalFilesDir(null)external-files-path
Context.getExternalCacheDir()external-cache-path

 

节点中的name 不可重名,path为自定义

 

关于相册选图和相机裁剪

 

有同学反映相册选图和相机裁剪时候的报错问题,这里也说一下
系统相册选图返回的Uri是可以直接使用的,不需要也不能使用FileProvider进行转换
如果需要根据uri获得转换后的uri 可以参考如下方式

 

Uri fromUri;
if (uri.getScheme() != null && uri.getScheme().startsWith("file")) {fromUri =FileProvider.getUriForFile(mContext,"me.xifengwanzhao.fileprovider", new File(FileUtils.getPath(mContext, uri)));//这里进行替换uri的获得方式intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//这里加入flag
} else {//相册选图适配fromUri = uri;
}

 

关于相机裁剪
相机裁剪 intent.setDataAndType(fromUri, “image/*”);这里是需要对uri进行转换的,
而 intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));这里使用原来的方式获取uri就可以了
那么启动系统裁剪的方法可以写成这样

 

    /*** 开启截图,启动系统的截图方法 返回requestCode为 {Constant.IMG_ZOOM}** @param mContext 必须为activity* @param uri      需要进行裁剪的图片的uri* @param size     截图的大小宽和高的数值,这里仅限截图为1:1的正方形* @return path 截图返回的路径* @see Constant#IMG_ZOOM*/public static String startPhotoZoom(Activity mContext, Uri uri, int size) {//这里生成一个保存截图用的临时路径并且返回出去String imgPath;File file = new File(Constant.ZOOM_IMAGE, Constant.getNewestImageName(mContext));imgPath = file.getPath();Intent intent = new Intent("com.android.camera.action.CROP");Uri fromUri;if (uri.getScheme() != null && uri.getScheme().startsWith("file")) {fromUri = FileProvider.getUriForFile(mContext, "me.xifengwanzhao.fileprovider", new File(FileUtils.getPath(mContext, uri)));//这里进行替换uri的获得方式intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);//这里加入flag} else {//相册选图适配fromUri = uri;}intent.setDataAndType(fromUri, "image/*");intent.putExtra("crop", "true");intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));if (android.os.Build.MANUFACTURER.contains("HUAWEI")) {// 华为特殊处理 不然会显示圆intent.putExtra("aspectX", 9998);intent.putExtra("aspectY", 9999);} else {intent.putExtra("aspectX", 1);intent.putExtra("aspectY", 1);}intent.putExtra("outputX", size);intent.putExtra("outputY", size);mContext.startActivityForResult(intent, Constant.IMG_ZOOM);return imgPath;}

 

参考文档

 

[1]Android N 调用相册crash- FileUriExposedException
[2]根据 Android Training课程写的FileProvider小例子
[3]使用FileProvider共享文件
[4]Android7.0适配教程与心得
[5]Android N 调用相册crash- FileUriExposedException


---------------------
作者:夕枫晚照
来源:CSDN
原文:https://blog.csdn.net/xifengwanzhao/article/details/53587234
版权声明:本文为作者原创文章,转载请附上博文链接!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/285728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

终于找到了,开源的Vue3+.NET6通用管理后台!

据说80%的.NET项目都是管理后台&#xff0c;然而能用上Vue3.NET6的管理后台并不多见。这里分享一套Vue3 Axios TS Vite ElementUI Plus .NET 6 WebAPI JWT SqlSugar的前后端分离架构的通用管理后台源码数据库脚本&#xff0c;还有与之配套录制的一组视频教程&#xff0c;全部打…

【Pix4d精品教程】Pix4d模型成果导出OSGB并加载OSGB到EPS进行三维测图完美案例教程

《无人机航空摄影测量精品教程》合集目录(Pix4d、CC、EPS、PhotoScan、Inpho) 在垂直摄影中,Pix4d也可以生成漂亮的三维模型,并导出为OSGB,加载到EPS进行三维测图。首先来看生成的三维格网纹理和EPS三维模型加载效果。 Pix4d生成的三维格网纹理: EPS加载OSGB模型效果: 文…

Vim 批量替换

假设在非Win系统下。 想批量替换文本不再是Ctrl&#xff0b;F那么简单了&#xff0c; 一般用Vim来做批量替换&#xff0c; 略微复杂点&#xff1a; 比如将192.168.0.1替换为192.168.0.2 :%s/192.168.0.1/192.168.0.2/g

Android实现ListView(1)

昨天有个朋友问我Android ListView列表视图&#xff0c;遇到了点错误&#xff0c;今天我给大家演示&#xff0c;具体实现见图&#xff1a; 1&#xff1a;创建一个item布局layout/item.xml 2&#xff1a;创建一个ListViewActivity类&#xff0c;但是必须继承ListActivity&#x…

WolframAlpha 的使用

WolframAlpha 1. 求解复杂方程组 ab−4abc2ac1直接点开网站&#xff0c;在输入框中输入&#xff0c;ab-4;abc2;ac1;&#xff08;逗号分割开来&#xff09;&#xff0c; 转载于:https://www.cnblogs.com/mtcnn/p/9423087.html

C语言试题八十六之兔子生兔子问题

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 假设一对兔…

聊聊 C# 中的 Composite 模式

‍写在前面 Composite组合模式属于设计模式中比较热门的一个&#xff0c;相信大家对它一定不像对访问者模式那么陌生&#xff0c;毕竟谁又没有遇到过树形结构呢。不过所谓温故而知新&#xff0c;我们还是从一个例子出发&#xff0c;起底一下这个模式吧。一个简单例子 设想我们…

140种Python标准库、第三方库和外部工具都有了

导读&#xff1a;Python数据工具箱涵盖从数据源到数据可视化的完整流程中涉及到的常用库、函数和外部工具。其中既有Python内置函数和标准库&#xff0c;又有第三方库和工具。 这些库可用于文件读写、网络抓取和解析、数据连接、数清洗转换、数据计算和统计分析、图像和视频处理…

【CC精品教程】任务一:CC新建工程、添加照片、相机参数设置、选择坐标系统

《无人机航空摄影测量精品教程》合集目录(Pix4d、CC、EPS、PhotoScan、Inpho) 同Pix4d一样,CC(Context Capture),也称Smart 3D,也是无人机航测中人手必备的一款软件,在空三运算,三维模型构建等倾斜摄影测量方面有很大的优势,精度也相当高。本CC系列精品教程从项目的角…

C语言试题八十七之实现选择排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 C语言选择排…

java concurrent之前戏synchronized

对于多线程共享资源的情况须要进行同步&#xff0c;以避免一个线程的修改被还有一个线程的修改所覆盖。最普遍的同步方式就是synchronized。把代码声明为synchronized。有两个重要后果&#xff0c;一般是指该代码具有 原子性&#xff08;atomicity&#xff09;和 可见性&#x…

开源项目【zheng】搭建流程

2019独角兽企业重金招聘Python工程师标准>>> 搭建过程 项目地址 https://gitee.com/shuzheng/zheng这两篇写的比较详细的搭建过程&#xff0c;结合一下就没什么问题了。 https://my.oschina.net/yzuzhang/blog/1538555http://www.jianshu.com/p/b2fb42e17b581.JDK 1…

简述HTML DOM及其节点分类

在JavaScript中&#xff0c;document这个对象大家一定很熟悉&#xff0c;哪怕是刚刚开始学习的新人&#xff0c;也会很快接触到这个对象。而document对象不仅仅是一个普通的JavaScript内置对象&#xff0c;它还是一个巨大API的核心对象&#xff0c;这个巨大的API就是DOM&#x…

【CC精品教程】任务二:导入像控点、差分POS,空三平差权重设置,提交自由空三

《无人机航空摄影测量精品教程》合集目录(Pix4d、CC、EPS、PhotoScan、Inpho) 【CC精品教程】任务一:CC新建工程、添加照片、相机参数设置、选择坐标系统 本任务接着上一个任务,继续完成CC项目作业,主要内容有:导入像控点、选择空间参考系统,导入差分POS,空三平差权重设…

[转]如何进行单元测试

一、单元测试步骤 代码编写完成后的单元测试工作主要分为两个步骤&#xff1a; 人工静态检查 人工静态检查是测试的第一步&#xff0c;这个阶段工作主要是保证代码算法的逻辑正确性&#xff08;尽量通过人工检查发现代码的逻辑错误&#xff09;、清晰性、规范性、一致性、算法…

WPF 基础控件之 TabControl样式

其他基础控件1.Window2.Button3.CheckBox4.ComboBox5.DataGrid 6.DatePicker7.Expander8.GroupBox9.ListBox10.ListView11.Menu12.PasswordBox13.TextBox14.RadioButton15.ToggleButton16.Slider 17.TreeView TabControl 实现下面的效果1&#xff09;TabControl来实现动画&…

开发团队测试的难与易

做了多年的研发工程师&#xff0c;在所处的环境中&#xff0c;所接触的开发人员中很少有看重对自己代码进行测试这项工作的。大多研发人员往往是写好了代码运行起来&#xff0c;简单做下测试&#xff0c;甚至不去测试就抛给接口使用者或者质量管理人员。而且理由很充分“没时间…

C语言试题八十八之实现选冒泡排序算法

📃个人主页:个人主页 🔥系列专栏:C语言试题200例目录 💬推荐一款刷算法、笔试、面经、拿大公司offer神器 👉 点击跳转进入网站 ✅作者简介:大家好,我是码莎拉蒂,CSDN博客专家(全站排名Top 50),阿里云博客专家、51CTO博客专家、华为云享专家 1、题目 C语言实现冒…

两个数值交换位置

2019独角兽企业重金招聘Python工程师标准>>> 先说非计算机专业都能理解的。 int a 10; int b 20; 方法一&#xff1a; int c a; a b; b c; System.out.println("a"a",b"b); 方法二&#xff1a; a a b; b a - b; a a - b; System.out…

教你如何在Android 6.0上创建系统悬浮窗

郭霖大神的文章:http://mp.weixin.qq.com/s?__bizMzA5MzI3NjE2MA&mid2650235949&idx1&sn0f7eded67f834d38b02f8872768cb68a&scene0#wechat_redirect今天周二&#xff0c;又该跟大家分享由我执笔的文章了。从之前我写的deep links、通知栏微技巧这两篇文章中&a…