FileProvider
當使用FileProvider生成uri時关翎,使用uri的intent應(yīng)添加
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
來授予權(quán)限。
·使用系統(tǒng)裁剪時遇到的坑
Intent intent = new Intent("com.android.camera.action.CROP");
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
intent.setDataAndType(uri, "image/*");
// 下面這個crop=true是設(shè)置在開啟的Intent中設(shè)置顯示的VIEW可裁剪
intent.putExtra("crop", "true");
intent.putExtra("return-data", false);
intent.putExtra(MediaStore.EXTRA_OUTPUT, tempUri);
startActivityForResult(intent,REQUEST_CODE_CUT_PHOTO);
當intent.setDataAndType(uri,"image/*");中的 uri 和 intent.putExtra(MediaStore.EXTRA_OUTPUT,tempUri); 中 tempUri 一致時,
使用intent.addFlags即可,但當uri和tempUri不一致時則會報錯
java.lang.SecurityException: Permission Denial: opening provider android.support.v4.content.FileProvider from ProcessRecord,
這是因為intent.addFlags只是為inten訪問uri添加了權(quán)限,沒有為訪問tempUri添加權(quán)限脸候,所以保存裁剪圖時會報錯,這時必須使用如下代碼來為intent添加tempUri權(quán)限
List resInfoList = getActivity().getPackageManager().queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY);
for(ResolveInfo resolveInfo : resInfoList) {
String packageName = resolveInfo.activityInfo.packageName;
getActivity().grantUriPermission(packageName,tempUri,Intent.FLAG_GRANT_WRITE_URI_PERMISSION|
Intent.FLAG_GRANT_READ_URI_PERMISSION);
}