在今天,项目的功能开发的告一段落了,回顾之前遇到的难题,觉得有必要在博客中记录一下,也方便下次自己能快速解决问题,同时,也能给遇到同样问题的人一个参考。
这问题就是当用户使用android 7.0系统的手机进行拍照的时候,崩溃的问题。崩溃的原因,网上有很多详细的介绍,参考官方文档对该错误的解释,是由于出于安全考虑,Android 7.0[API24]以及以上版本不支持file://,类型的uri,而是使用content://URI。不然会报
android.os.FileUriExposedException这个错误提示
现在直接说明解决额步骤吧。
1.在清单文件AndroidManifest.xml中建一个内提供者
<!-- 适配android 7.0 拍照闪退的处理 ,其中authorities的值要和等下代码中使用的一致就行,其中resource内的文件就是拍照后的共享文件 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.chc.photo.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文件夹,然后在xml文件夹下面建立一个file_paths的xml文件作为provider的共享文件路径
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path path="" name="camera_photos" />
<files-path path="" name="photos" />
</paths>
</resources>
其中name:一个引用字符串,意思就是可以随便写。
path:文件夹“相对路径”,完整路径取决于当前的标签类型。
path可以为空,表示指定目录下的所有文件、文件夹都可以被共享。
在这个文件中,为每个目录添加一个XML元素指定目录。paths 可以添加多个子路径:< files-path> 分享app内部的存储;< external-path> 分享外部的存储;< cache-path> 分享内部缓存目录。
< files-path >
代表目录为:Context.getFilesDir()
代表目录为:Environment.getExternalStorageDirectory()
代表目录为:getCacheDir()
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
如果对于path不理解的可以查询资料。
3.在代码中将原来的方法做判断,新增7.0的适配方法
拍照
Intent camera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
//适配android7.0 手机拍照取uri的处理
if(Build.VERSION.SDK_INT<24){
uri = Uri.fromFile(imgFile);//7.0这里会闪退,imgfile是图片文件路径
camera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
}else{
uri=FileProvider.getUriForFile(SellerAffiliate.this,"com.chc.photo.fileprovider",imgFile);
camera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
camera.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION );//添加这一句表示对目标应用临时授权该Uri所代表的文件
}