从Android 7.0开始的,不再允许在app中把file:// Uri暴露给其他app,否则应用会抛出FileUriExposedException。原因在于,Google认为使用file:// Uri存在一定的风险。比如,文件是私有的,其他app无法访问该文件,或者其他app没有申请READ_EXTERNAL_STORAGE运行时权限。解决方案是,使用FileProvider生成content:// Uri来替代file:// Uri。
点击打开链接这里是官网文档 www.zhouyi339.com 周易起名 宝宝起名 喜用神起名 免费名字大全
下面是我自己写的配置:
首先在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 这个标签不是唯一的一个标签、还有很多标签标示不一样的路径,具体可以看上面链接官方给的说明
第三步:(使用)www.zhouyi339.com 周易起名 宝宝起名 喜用神起名 免费名字大全
//通过照相机获取图片
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:注意动态获取权限