我正在尝试获取设备上所有图像的列表。实现这一目标的关键命令是查询命令:
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);
}
答案 0 :(得分:1)
我想理解为什么清单中要求的权限不够
如果您的targetSdkVersion
为24或更高,则在Android 6.0及更高版本的设备上应该不够用。对于较新的应用和较新的设备,您还必须request certain permissions at runtime,而READ_EXTERNAL_STORAGE
就是其中之一。
您的requestPermissions()
呼叫无效的原因是因为该呼叫不同步。它是异步的。直到onRequestPermissionsResult()
您是否获得许可才会知道。
因此,您需要将query()
作品隔离为一个单独的方法,您可以从两个地方调用:
现在的情况,当且仅当checkSelfPermission()
表示您已获得许可
onRequestPermissionsResult()
,针对您的特定请求,如果结果表明用户同意授予您权限