美文网首页Netty
趟坑记录-FileProvider

趟坑记录-FileProvider

作者: 萧笑啸 | 来源:发表于2017-08-16 12:35 被阅读0次

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

    相关文章

      网友评论

        本文标题:趟坑记录-FileProvider

        本文链接:https://www.haomeiwen.com/subject/dphirxtx.html