在android 7.0以上的手机上打开相机、相册会报如下错误:
android.os.FileUriExposedException: ** exposed beyond app through Intent.getData()
原因
在Android7.0系统上, 如果一项包含文件 file:// URI类型 的 Intent 离开你的应用,应用失败,并出现 FileUriExposedException 异常,如调用系统相机拍照,或裁切照片。
解决方案
参考博客
满天星爱我
鸿洋_ Android 7.0 行为变更 通过FileProvider在应用间共享文件吧
具体步骤
1. 在清单文件中注册一个FileProvider
2. 创建FileProvider使用的xml文件
3. 实现URI和Intenet跳转
1. 在清单文件中注册一个FileProvider
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.mydomain.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
需要注意:android:authorities属性值是可变的(可以改成你自己喜欢的)。标签中android:name属性值是固定的。android:resource属性值为第二步中我们创建的xml文件名称。
2. 创建FileProvider使用的xml文件
(文件路径:res>xm>file_paths)
<?xml version="1.0" encoding="utf-8"?>
<paths>
<files-path
name="name"
path="pics" />
<cache-path
name="name"
path="pics" />
<external-files-path
name="name"
path="pics" />
<external-path
name="name"
path="pics" />
</paths>
不同的标签代表不同的目录。
- < root-path /> 代表设备的根目录new File("/");
- < files-path /> 代表context.getFilesDir()
- < cache-path /> 代表context.getCacheDir()
- < external-path /> 代表Environment.getExternalStorageDirectory()
- < external-files-path />代表context.getExternalFilesDirs()
- < external-cache-path />代表getExternalCacheDirs()
标签下的path代表路径下的子目录。如:
<external-path
name="external"
path="pics" />
表示代表的目录即为:Environment.getExternalStorageDirectory()/pics,其他同理。
3. 实现URI和Intenet跳转
Intent openCameraIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
File file = new File(AppConfig.APP_IMG_SAVE_PATH, String.valueOf(System.currentTimeMillis()) + ".jpg");
photoPath = file.getPath();
Uri data = FileProvider.getUriForFile(this,"com.mydomain.fileprovider", file);
// 给目标应用一个临时授权
openCameraIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
//指定存储路径,保存原图
openCameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, data);
startActivityForResult(openCameraIntent, ComConstant.ActivityRequestCode.PICTURE_FROM_CAPTURE);
这样就不会有问题了。试了一下向下兼容的不需要区分API。
最后本人开了一个贝店。
微信号TEL18756061915