趟坑记录-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/*");

// 下面这个crop=true是设置在开启的Intent中设置显示的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添加了权限,没有为访问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);

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容