无法请求 READ_EXTERNAL_STORAGE 权限

5

我正在尝试从存储中读取图像路径,但在此处不断出现SecurityException:

Caused by: java.lang.SecurityException: Permission Denial: reading com.android.providers.media.MediaProvider uri content://media/external/images/media from pid=31409, uid=10053 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission()

我正在编译API 23,并在我的清单文件中明确声明权限作为其直接子级。我也知道新的运行时权限规定,即当您想访问存储时,必须在运行时请求权限。但是,当我写下开始检查权限的那一行代码时,IDE会报“无法解析”:

ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE)

无法解决符号Manifest.permission.READ_EXTERNAL_STORAGE。在我的代码中,我唯一可以明确声明的Manifest.permission是Manifest.permission.C2D_MESSAGE,而不会出现无法解决的错误。我需要编译其他内容才能在代码中访问其他权限吗?
只要清楚,这是给我SecurityException的代码块:
public List<String> getCameraImagesFull(Context context) {
        Cursor cursor = null;
        String[] star = {"*"};
        ArrayList<String> result = new ArrayList<>();
        cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC");
        if (cursor != null) {
            if (cursor.moveToFirst()) {
                do {
                    String path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
                    result.add(path);
                } while (cursor.moveToNext());
            }
            cursor.close();
        }
        return result;
    }

这是抛出异常的行:

cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, star, null, null, MediaStore.MediaColumns.DATE_ADDED + " DESC");

这是我清单文件中列出的所有权限:

<permission
        android:name="com.example.gcm.permission.C2D_MESSAGE"
        android:protectionLevel="signature" />

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
    <uses-permission android:name="com.example.gcm.permission.C2D_MESSAGE" />

我想知道如何请求权限以获取图像路径。在任何Lollipop版本上编译都可以正常工作,但是在Marshmallow上使用新的运行时权限时出现了SecurityException。非常感谢您的帮助。


我认为你在 Android 6.0 Marshmallow 中遇到了这个问题,我也遇到了同样的问题,但我无法请求外部存储的读取权限,你找到任何方法了吗? - Herry
好的,我从你下面回答的评论中找到了它。 - Herry
你好,请尝试使用API Level 23 https://dev59.com/J1wX5IYBdhLWcg3w-Thv#41221852 - Bipin Bharti
1个回答

9

无法解析符号Manifest.permission.READ_EXTERNAL_STORAGE

您需要添加一个导入语句,导入 android.Manifest,就像您处理其他Java类一样。

在我的代码中,我唯一可以明确声明的Manifest.permission是Manifest.permission.C2D_MESSAGE,否则会出现无法解析错误

android.Manifest.permission 中没有这样的值 (C2D_MESSAGE)。我甚至不知道有一个名为 Manifest 的类,其中有一个名为 permission 的内部类,并且有一个名为 C2D_MESSAGE 的字段。


谢谢,我现在明白了。当我引用Manifest.permission时,我是从自己的应用程序包而不是Android包中使用它的......只要我将其声明为'android.Manifest.permission.READ_EXTERNAL_STORAGE'而不是'Manifest.permission.READ_EXTERNAL_STORAGE',我就可以使用READ_EXTERNAL_STORAGE。 - Nicholas Pesa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接