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()
上面這個(gè)異常先不談,先說(shuō)說(shuō)Android7.0以后調(diào)用相機(jī)會(huì)崩潰的問(wèn)題
先說(shuō)以前調(diào)用系統(tǒng)相機(jī)拍照的時(shí)候,流程是這樣的:
Intent takePictureIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
?? if (takePictureIntent.resolveActivity(getPackageManager()) != null) {
? //創(chuàng)建一個(gè)路徑保存圖片 photoFile = ImageUtil.createImageFile();
???? if (photoFile != null) { photoURI = Uri.fromFile(photoFile);
??? //傳遞一個(gè)Uri takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoURI);
??? startActivityForResult(takePictureIntent, TAKE_PHOTO);
? }
}
但是在Android7.0系統(tǒng)下直接崩潰了,后來(lái)在網(wǎng)上找了原因,是由于Android7.0執(zhí)行了“StrictMode API 政策禁”的原因,有興趣的可以自己去搜索了解,我就不解釋了,給大家一個(gè)簡(jiǎn)書(shū)地址去看,已經(jīng)寫(xiě)的很詳細(xì)了
http://www.itdecent.cn/p/fbae13948115?? 文章后面還有GitHub 的demo地址
我要說(shuō)的是,拍照和選擇照片完成后,經(jīng)過(guò)裁剪后的照片,需要有Uri的讀寫(xiě)權(quán)限才可以使用,否則會(huì)出現(xiàn)無(wú)法獲取的錯(cuò)誤:
.//添加Uri讀寫(xiě)權(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);
???????//將剪切的圖片保存到目標(biāo)Uri中
?????? intent.putExtra(MediaStore.EXTRA_OUTPUT, desUri);
?????? intent.putExtra("return-data", false);
?????? intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());
?????? intent.putExtra("noFaceDetection", true);
??????? //添加Uri讀寫(xiě)權(quán)限,否則7.0以上版本無(wú)法讀寫(xiě)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);
}