java.lang.SecurityException: Permission Denial: writing android.support.v4.content.FileProvider uri content://com.example.user014.komodo.fileprovider/camera_photos/storage/emulated/0/crop_photo.jpg from pid=10041, uid=10022 requires the provider be exported, or grantUriPermission()
上面這個異常先不談,先說說Android7.0以后調(diào)用相機會崩潰的問題
先說以前調(diào)用系統(tǒng)相機拍照的時候角钩,流程是這樣的:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
?? if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
? //創(chuàng)建一個路徑保存圖片 photoFile = ImageUtil.createImageFile();
???? if (photoFile != null) { photoURI = Uri.fromFile(photoFile);
??? //傳遞一個Uri takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
??? startActivityForResult(takePictureIntent, TAKE_PHOTO);
? }
}
但是在Android7.0系統(tǒng)下直接崩潰了,后來在網(wǎng)上找了原因,是由于Android7.0執(zhí)行了“StrictMode API 政策禁”的原因,有興趣的可以自己去搜索了解,我就不解釋了,給大家一個簡書地址去看,已經(jīng)寫的很詳細了
http://www.reibang.com/p/fbae13948115?? 文章后面還有GitHub 的demo地址
我要說的是,拍照和選擇照片完成后,經(jīng)過裁剪后的照片,需要有Uri的讀寫權(quán)限才可以使用,否則會出現(xiàn)無法獲取的錯誤:
.//添加Uri讀寫權(quán)限
public static void cropImageUri(Activity activity, Uri orgUri, Uri desUri, int aspectX, int aspectY, int width, int height, int requestCode) {
?????? Intent intent = new Intent("com.android.camera.action.CROP");
??????? if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
??????????? Log.d(TAG, "cropImageUri: " + "provider被授予權(quán)限導(dǎo)出");
?????????? intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
?????? }
?????? intent.setDataAndType(orgUri, "image/*");
?????? intent.putExtra("crop", "true");
?????? intent.putExtra("aspectX", aspectX);
?????? intent.putExtra("aspectY", aspectY);
?????? intent.putExtra("outputX", width);
?????? intent.putExtra("outputY", height);
?????? intent.putExtra("scale", true);
???????//將剪切的圖片保存到目標Uri中
?????? intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri);
?????? intent.putExtra("return-data", false);
?????? intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
?????? intent.putExtra("noFaceDetection", true);
??????? //添加Uri讀寫權(quán)限,否則7.0以上版本無法讀寫Uri路徑文件?
?????? List resInfoList = activity.getPackageManager().queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY);
?????? for (ResolveInfo resolveInfo : resInfoList) {
??????????? String packageName = resolveInfo.activityInfo.packageName;
??????????? activity.grantUriPermission(packageName, desUri, Intent.FLAG_GRANT_WRITE_URI_PERMISSION |??? Intent.FLAG_GRANT_READ_URI_PERMISSION);
?????? }
????? activity.startActivityForResult(intent, requestCode);
}