Android 7.0 拍照并显示照片出现"FileUriExposedException"
2016-12-09 14:39
453 查看
问题描述
拍照后显示缩略图没有问题,但是选择显示原图程序就崩溃了,抛出一个FileUriExposedException异常.
问题原因
《第一行代码》(第二版)的第八章里的 “调用摄像头和相册”小节讲到了这个问题:从Android 7.0系统开始,直接使用本地真实路径的Uri被认为是不安全的,会抛出一个FileUriExposedException异常。
解决办法
使用FileProviderFileProvider是一种特殊的内容提供器,它使用了和内容提供器类似的机制来对数据进行保护,可以选择性地将封装过的Uri共享给外部,从而提高了应用的安全性。
代码片段
// 创建File对象,用于存储拍照后的图片 File outputImage = new File(getExternalCacheDir(), "output_image.jpg"); //判断当前Android版本号是否大于等于24 if (Build.VERSION.SDK_INT >= 24){ //如果是则使用FileProvider imageUri = FileProvider.getUriForFile(MainActivity.this, "com.example.cameraalbum.fileprovider", outputImage); } else { //否则,使用原来的fromFile() imageUri = Uri.fromFile(outputImage); }
其中,getUriForFile方法接受三个参数:
第一个参数要求传入Context对象,
第二个参数可以是任意唯一的字符串,
第三个参数则是之前创建的File对象。
此外,还要在AndroidManifest.xml中对内容提供器进行注册:
<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.example.camearalbum.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider>
其中,android:name 属性的值是固定的,android:authoritirs 属性的值必须要和FileProvider.getUriForFile() 方法中的第二个参数一致。
另外,这里还在
<provider>标签的内部使用
<meta-data>来指定Uri的共享路径,并引用了一个@xml/file_paths资源。
在res目录下新建一个xml目录然后新建一个file_paths.xml文件,并修改文件中的内容:
<?xml version="1.0" encoding = "utf-8"?> <paths xmlns:app="http://schemas.android.com/apk/res/android"> <external-path name = "my_images" path = "" /> </paths>
其中,
external-path就是用来指定Uri共享的,
name属性的值可以随便填,
path属性的值表示共享的具体路径。这里设定空就表示将整个SD卡进行共享,也可以仅共享存放output_image.jpg 这张图片的路径。
还有一点需要注意,在Android 4.4系统之前,访问SD卡的应用关联目录也是要声明权限的,从4.4系统开始不在需要权限声明。
为了兼容老版本系统,还需要在AndroidManifest.xml 中声明一下SD卡的权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
以上就可以解决Android 7.0直接使用本地真实路径的Uri会抛出
FileExposedExceptiond异常的问题了。
最后附上源码:GitHub
End
相关文章推荐
- android 7.0系统解决拍照的问题android.os.FileUriExposedException:
- android 7.0 + 相机拍照 FileUriExposedException
- android 7.0系统解决拍照的问题android.os.FileUriExposedException:file:///storage/emulated/0/test.txt
- Android 7.0调用相机拍照 报错 FileUriExposedException
- android 7.0 + 相机拍照 FileUriExposedException
- Android 7.0 拍照 FileUriExposedException
- ANDROID 7.0 上出现 android.os.FileUriExposedException 异常
- Android 7.0 出现 ”FileUriExposedException“ 和 ”解析包出现错误“ 异常的解决办法
- Android 7.0调用相机拍照,返回后显示拍照照片
- Android 7.0 调取系统相机崩溃解决android.os.FileUriExposedException
- 开发中碰到的问题:Android 7.0 更新APK在安装时的报错 android.os.FileUriExposedException: file:///storage/emulated/0/And
- Android 7.0调用系统相机报错Caused by: android.os.FileUriExposedException: file:///storage/emulated/0/rpms/14
- 解决 Android N 7.0 上 报错:android.os.FileUriExposedException
- android 7.0读取文件报异常信息 - android.os.FileUriExposedException
- Android 7.0行为变更 FileUriExposedException解决方法
- 解决 Android N 7.0 上 报错:android.os.FileUriExposedException
- Android 7.0的适配问题,android.os.FileUriExposedException
- Android 7.0 系统相机崩溃解决android.os.FileUriExposedException
- Android 7.0 android.os.FileUriExposedException
- [置顶] 解决 Android N 7.0 上 报错:android.os.FileUriExposedException