解决异常 android.os.FileUriExposedException
从Android 7.0开始的,不再允许在app中把file:// Uri暴露给其他app,否则应用会抛出FileUriExposedException。原因在于,Google认为使用file:// Uri存在一定的风险。比如,文件是私有的,其他app无法访问该文件,或者其他app没有申请READ_EXTERNAL_STORAGE运行时权限。解决方案是,使用FileProvider生成content:// Uri来替代file:// Uri。
点击打开链接这里是官网文档
下面是我自己写的配置:
首先在AndroidManifest.xml中配置如下
第一步
<!--start 7.0因以后不能暴露file://的uri,所以配置 (在xml文件夹下还有一个文件可对比看)--> <provider android:name="android.support.v4.content.FileProvider" android:authorities="com.kingyon.godplay.fileProvider"//红字是包名,fileProvider固定就可以 下面的必须一样 android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths" /> </provider> <!--end-->
第二步
新建xml文件 flie_paths.xml //名字可以随便取 与AndroidManifest.xml下保持一致<meta-data android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
下面是flie_paths.xml 文件内容
简单解释下意思:
external-path 这个标签表明是什么路径下(如:external-path指向的是这个路径下Environment.getExternalStorageDirectory().)
path 表明文件夹名称,如果为 "."表明所有文件夹;如果为"img" 表明就是Environment.getExternalStorageDirectory().img/ 下路径,以此类推
name 表明这个路径下的文件名称。如我的配置就是
Environment.getExternalStorageDirectory().path/user_icon //这个文件
这里提一下:external-path 这个标签不是唯一的一个标签、还有很多标签标示不一样的路径,具体可以看上面链接官方给的说明
第三步:(使用)
//通过照相机获取图片 private void getBitmapFromCamera(BaseActivity activity) { if (activity == null) { return; } Intent intent = new Intent(); // 判断版本大于等于7.0 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { uri = FileProvider.getUriForFile(activity, "com.kingyon.godplay.fileProvider", USER_ICON);//蓝色的为包名,与配置文件保持一致 // 给目标应用一个临时授权 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); } else { uri = Uri.fromFile(USER_ICON);//就是这句引起的,7.0以后不准这么随意的写咯 } // 下面这句指定调用相机拍照后的照片存储的路径 intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); activity.startActivityForResult(intent, CODE_CAMERA_REQUEST); }
完毕。ps:注意动态获取权限