Android 7.0和8.0相機(jī)權(quán)限問(wèn)題

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);

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容