Android 7.0 之后相机/文件读写等权限获取方式改变,导致开启相机闪退
Posted ichenwin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android 7.0 之后相机/文件读写等权限获取方式改变,导致开启相机闪退相关的知识,希望对你有一定的参考价值。
在 android 7.0 之前 Google 提供的动态申请权限的 API,可以调用相机拍照,访问SDcard等操作都只需要申请对应的权限,如下:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
但是 7.0 更新之后,Google 收紧了对私有目录的访问权限 。Android 7.0 中尝试传递 file://URI 会触发 FileUriExposedException,因为在 Android 7.0 之后 Google 认为直接使用本地的根目录即 file://URI 是不安全的操作,直接访问会抛出 FileUriExposedExCeption 异常,这就意味着在Android 7.0 以前我们访问相机拍照存储时,如果使用URI的方式直接存储剪裁图片就会造成这个异常,那么如何解决这个问题呢?
Google 为我们提供了 FileProvider 类,进行一种特殊的内容提供,FileProvider 是 ContentProvide 的子类,它使用了和内容提供器类似的机制来对数据进行保护,可以选择性地将封装过的 URI 共享给外部,从而提高了应用的安全性。下面就让我们看一下如何使用这个内容提供者进行数据访问的:
1. 使用 FileProvider 获取 URI 就会将以前的 file://URI 准换成 content://URI,实现一种安全的应用间数据访问,内容提供者作为 Android 的四大组件之一,使用同样需要在清单文件 AndroidManifest.xml 中进行注册的,注册方法如下:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.cc.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
2. 在res目录下创建 xml 文件夹,file_paths.xml 文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path
name="camera_rec"
path="" />
</paths>
3. 获取相机权限
/**
* 自动获取相机权限
*/
private void autoObtainCameraPermission()
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED
|| ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)
ActivityCompat.requestPermissions(this, new String[]Manifest.permission.CAMERA, Manifest.permission.READ_EXTERNAL_STORAGE, CAMERA_PERMISSIONS_REQUEST_CODE);
else //有权限直接调用系统相机拍照
参考:https://www.jianshu.com/p/12b8812038d8
以上是关于Android 7.0 之后相机/文件读写等权限获取方式改变,导致开启相机闪退的主要内容,如果未能解决你的问题,请参考以下文章
Android 开发 关于7.0 FileUriExposedException异常 详解
一行代码实现安卓照片选取上传服务器,并适配安卓7.0无法调起相机的问题
Android开发之深入理解Android 7.0系统权限更改相关文档
在使用 Ionic 3 允许系统权限后,Android 设备相机未打开