使用" grantUriPermission"时的java.lang.SecurityException在URI上

时间:2018-01-28 09:34:33

标签: android android-intent android-permissions android-image

我的应用程序通过java.lang.SecurityException收到了几个崩溃报告。当app尝试获取对其图像中选择的图像URI用户的持久权限时,会发生这种情况。 选择图像的方法是通过意图:

public static Intent openGalleryToSelectImages(Activity a)
{
    Intent intent = new Intent();
    // Set action
    if( Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
        intent.setAction(Intent.ACTION_OPEN_DOCUMENT);
    }
    else {
        intent.setAction(Intent.ACTION_GET_CONTENT);
    }
    // Set MIME type and allow multiple selection
    intent.setType("image/*");
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) {
        intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true);
    }
    a.startActivityForResult(Intent.createChooser(intent,"Select Picture"), Communication.REQUEST_SELECT_IMAGES_FROM_GALLERY);

    return intent;
}

然后我在收到的URI数组上执行一些操作。 当对于每个URI,我尝试获得持久的读取权限时发生崩溃:

activity.grantUriPermission(activity.getPackageName(), uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);
activity.getContentResolver().takePersistableUriPermission(uri, Intent.FLAG_GRANT_READ_URI_PERMISSION);

但是我无法弄清楚那是什么问题。 除此之外,该应用程序在多个智能手机上运行良好,因此它似乎与特定供应商绑定。

编辑: 我无法对设备进行深度分析导致崩溃。 在我的开发设备上,图像的URI类似于:

content://com.android.providers.media.documents/document/image%3A796

1 个答案:

答案 0 :(得分:0)

您无法向自己授予权限。

您要求其他应用程序(例如图库)向您提供资源的Uri,如果该应用程序写得很好,它会在您返回时授予您的应用程序对该Uri的读取权限。

不幸的是,一些图库应用程序(包括一个着名的Android手机制造商的应用程序)不会给你任何东西。

这就是我们最终必须请求READ_EXTERNAL_STORAGE权限的方式。这也意味着您需要在适当的时候在Android 6+上请求运行时权限。

当我绝对需要时,我最终抓住了SecurityException并请求运行时权限。

课程学到了很多方法:当你在onRequestPermissionsResult取回正面结果时,你的活动处于停止状态。如果您立即离开(例如在回调中调用startActivity),则无法保存状态并且会丢失对成员变量的任何更改。现在将您需要的内容放入成员变量中,但将startActivity推迟到onResume