使用系统裁剪时FileProvider权限问题


FileProvider使用

当使用FileProvider生成uri时,使用uri的intent应添加

intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);

来授予权限。

使用系统裁剪时遇到的坑

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/*");     
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只是为intent访问uri添加了权限,没有为访问tempUri添加权限,所以保存裁剪图时会报错,这时必须使用如下代码来为intent添加tempUri权限

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

文章作者: 萧笑啸
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 萧笑啸 !
 上一篇
RxJava2-doOn系列方法未调用问题记录 RxJava2-doOn系列方法未调用问题记录
现象: 在map,flatmap中手动抛出异常,Subscriber的onError()方法被调用,但是doOnError/doOnTerminate等操作符未被调用,仅有doOnCancel被调用。 尝试解决过程: 修改一下,将do
2018-01-04
本篇 
使用系统裁剪时FileProvider权限问题 使用系统裁剪时FileProvider权限问题
FileProvider使用当使用FileProvider生成uri时,使用uri的intent应添加 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFl
2017-08-16
  目录