无法获得android.permission.READ_EXTERNAL_STORAGE

时间:2016-12-06 00:46:17

标签: android image permissions

我正在尝试获取设备上所有图像的列表。实现这一目标的关键命令是查询命令:

       Cursor cursor = getContentResolver().query(
            MediaStore.Images.Media.EXTERNAL_CONTENT_URI, columns, null,
            null, null);

我放在主要活动的onCreate()方法中。

在清单文件中我提出了所需的权限(在根目录下)  节点):

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

据我所知,这就是我需要做的。但是这个代码失败了(在上面的命令中)有一个安全异常,告诉我需要READ_EXTERNAL_STORAGE权限。我以为我要求它,但它不在那里。我试着调试它,它不在那里。我试图在查询之前添加requestPermissions(...)命令,但它不起作用。

我得到的确切错误信息是:

 java.lang.RuntimeException: Unable to start activity componentInfo{com.galamit.pic1/com.galamit.pic1.MainActivity}: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=26249, uid=10012 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

我觉得我错过了一些非常基本的东西,但无法弄清楚它可能是什么。任何线索?

编辑:请求权限部分如下所示:

if(this.checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)== PackageManager.PERMISSION_DENIED) {
    requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},1);
}

1 个答案:

答案 0 :(得分:1)

  

我想理解为什么清单中要求的权限不够

如果您的targetSdkVersion为24或更高,则在Android 6.0及更高版本的设备上应该不够用。对于较新的应用和较新的设备,您还必须request certain permissions at runtime,而READ_EXTERNAL_STORAGE就是其中之一。

您的requestPermissions()呼叫无效的原因是因为该呼叫不同步。它是异步的。直到onRequestPermissionsResult()您是否获得许可才会知道。

因此,您需要将query()作品隔离为一个单独的方法,您可以从两个地方调用:

  • 现在的情况,当且仅当checkSelfPermission()表示您已获得许可

  • onRequestPermissionsResult(),针对您的特定请求,如果结果表明用户同意授予您权限