原因: Android 7.0 做了一些系统权限更改,为了提高私有文件的安全性,面向 Android 7.0 或更高版本的应用私有目录被限制访问,此设置可防止私有文件的元数据泄漏,如它们的大小或存在性。而此权限更改有多重副作用,其中之一就是当传递软件包网域外的 file:// URI 可能给接收器留下无法访问的路径。因此,尝试传递 file:// URI 会触发 FileUriExposedException。分享私有文件内容的推荐方法是使用 FileProvider。在应用间共享文件对于面向 Android 7.0 的应用,Android 框架执行的 StrictMode API 政策禁止在您的应用外部公开 file:// URI。如果一项包含文件 URI 的 intent 离开您的应用,则应用出现故障,并出现 FileUriExposedException 异常。要在应用间共享文件,应发送一项 content:// URI,并授予 URI 临时访问权限。进行此授权的最简单方式是使用 FileProvider 类。点击查看Android官方说明
解决方案 1.在清单文件添加如下代码
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="你的应用包名.fileProvider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
android:authorities="com.alex.demo.FileProvider" 自定义的权限
android:exported="false" 是否设置为独立进程
android:grantUriPermissions="true" 是否拥有共享文件的临时权限
android:resource="@xml/external_storage_root" 共享文件的文件根目录,名字可以自定义
2.在xml文件夹目录下新建provider_paths文件,名字自定义,添加如下代码
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path
name="camera_photos"
path="" />
</paths>
</resources>
3.调用系统相机处代码处理
//调用系统相机拍照
Intent cameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
if (cameraIntent.resolveActivity(getActivity().getPackageManager()) != null) {
cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, parUri(tempFile));
startActivityForResult(cameraIntent, REQUEST_CAMERA);
}
/**
* 生成uri
*
* @param cameraFile
* @return
*/
private Uri parUri(File cameraFile) {
Uri imageUri;
String authority = getContext().getPackageName()+ ".provider";
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
//通过FileProvider创建一个content类型的Uri
imageUri = FileProvider.getUriForFile(getContext(), authority, cameraFile);
} else {
imageUri = Uri.fromFile(cameraFile);
}
return imageUri;
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。