在做调用系统拍照的时候出现了问题,android.os.FileUriExposedException: file:///storage/emulated/0/DCIM/xxxx.jpg exposed beyond app through ClipData.Item.getUri()
前几天还好好的为啥出现了问题呢,后来就想到了刚升级了手机系统。然后就搜索一大堆的解决方案。此次记录下,方便以后查询。
打开相机
private void openCamera() {
if (!SDCardUtils.isSDCardEnable()) {
Toast.makeText(this, "sDCard不可用!", Toast.LENGTH_SHORT).show();
} else {
try {
String filePath = SDCardUtils.getSDCardPath();
String imagePath = DialogUtils.getPhotoFileName();
// 下面这句指定调用相机拍照后的照片存储的路径
File dir = new File(filePath + "/dirName");
if (!dir.exists()) {
dir.mkdirs();
}
File tmpFile = new File(dir, imagePath);
if (!tmpFile.exists()) {
tmpFile.createNewFile();
}
if (Build.VERSION.SDK_INT >= 24) {
imageUri = FileProvider.getUriForFile(this, "包名.fileprovider", tmpFile);//通过FileProvider创建一个content类型的Uri
} else {
imageUri = Uri.fromFile(tmpFile);
}
Intent intent = new Intent();
if (Build.VERSION.SDK_INT >= 24) {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
}
intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE);//设置Action为拍照
intent.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);//将拍取的照片保存到指定URI
startActivityForResult(intent, TAKE_PHOTO);
} catch (IOException e) {
e.printStackTrace();
}
}
}
以上可说的地方就是有一个配置的路径权限:
FileProvider.getUriForFile(this, "包名.fileprovider", tmpFile)这句是关键,其中‘包名’是自定义的,这里为了方便我是以项目的包名,切记。
需要在AndroidManifest.xml中配置:
<!-- 适配安卓7.0拍照 -->
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="包名.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
file_paths:需要在资源目录下新建xml目录如图:
<?xml version="1.0" encoding="utf-8"?>
<paths>
<external-path path="" name="camera_photos" />
</paths>