情景
Android 24之后,加强了文件访问权限控制,调用相机、图片裁剪等情况就会报错。之前遇到过懒得记,再次遇到简单记一下。
处理
1.Manifests文件注册
<application>
<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>
</application>
2.创建注册所需路径
res文件夹新建xml文件夹,新建file_paths.xml文件,内容如下:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<paths>
<external-path name="camera_photos"
path="" /><!--开放私有文件的路径,为空表示开放所有文件权限-->
</paths>
</resources>
3.调用相机
private void showCameraAction() {
try {
Intent intent = dispatchTakePictureIntent();
startActivityForResult(intent, ImageCaptureManager.REQUEST_TAKE_PHOTO);
} catch (Exception e) {
Toast.makeText(this, "相机调用失败", Toast.LENGTH_SHORT).show();
e.printStackTrace();
}
}
public Intent dispatchTakePictureIntent() throws IOException {
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri = null;
try {
File imageFile = createImageFile();
//API>=24 android 7.0
if (Build.VERSION.SDK_INT >= 24){
if (intent.resolveActivity(mContext.getPackageManager()) != null){
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); //添加这一句表示对目标应用临时授权该Uri所代表的文件
uri = FileProvider.getUriForFile(mContext,"包名.fileprovider",imageFile);
}
}else {//<24
uri = Uri.fromFile(imageFile);
}
intent.putExtra(MediaStore.EXTRA_OUTPUT, uri);
} catch (IOException e) {
e.printStackTrace();
}
return intent;
}