Android7.0拍照失败FileUriExposedException异常的解决

背景:
项目中,基本都有用户自定义头像或自定义背景的功能,实现方法一般都是调用系统相机–拍照,或者系统相册–选择照片,然后进行剪裁,最终设为头像或背景。 
而在Android6.0之后,需要动态获取权限,而且Android7.0之后,无法直接根据拍照返回的URI拿到图片,这是因为从安卓7.0开始,直接使用本地真实路径被认为是不安全的,会抛出FileUriExposedExCeption异常,本文就是基于这个功能去针对Android7.0进行操作。 

第一步:Android6.0之前,调用系统拍照,只需要在AndroidManifest.xml声明 
<uses-permission  Android:name="android.permission.CAMERA" /> 
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
权限,而在6.0以后,则需要申请权限,先来调用相机拍照。 

第二步:通过FileProvider创建一个content类型的Uri,不仅是通过FileProvider.getUriForFile(Activity.this, “com.ddz.demo”, file);而且在AndroidManifest.xml中进行配置,android:authorities要和FileProvider中一样,同时在xml中配置路径
FileProvider在AndroidManifest.xml中配置如下:
<provider 
android:name="android.support.v4.content.FileProvider” 
android:authorities="com.ddz.demo” 
android:exported="false” 
android:grantUriPermissions="true”>
<meta-data 
android:name="android.support.FILE_PROVIDER_PATHS” 
android:resource="@xml/file_paths" /> 
</provider>
路径配置如下:
<?xml version="1.0" encoding="utf-8”?>
<paths xmlns:android=" http://schemas.android.com/apk/res/android”> 
<external-path 
name="my_images" path="images/" />
</paths>

第三步: 系统相册选择照片  
系统相册选择照片比较简单,直接调用对应方法: 
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
startActivityForResult(intent, REQUEST_PICTURE);
剪裁照片  
思路:拿到返回路径之后,,获取图像,并压缩,返回压缩图像进行剪裁 

你可能感兴趣的:(android,APP,拍照,7.0系统适配)