安卓READ_EXTERNAL_STORAGE权限不起作用

我正在尝试创建一个简单的应用程序,该应用程序可以从图库应用程序获取图像并将其显示在图像按钮上。我正在运行 Android 5.0.1 的手机上使用 API 21 进行测试。不幸的是,无论我尝试什么,我都会收到安全错误 - 即使我指定了权限。

我用于检索图像的代码是:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent imageReturnedIntent){
    super.onActivityResult(requestCode, resultCode, imageReturnedIntent);

    switch(requestCode){
        case PICK_IMAGE_REQUEST:
            if(resultCode == RESULT_OK && imageReturnedIntent != null && imageReturnedIntent.getData() != null) {
                Uri uri = imageReturnedIntent.getData();
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), uri);
                    // Log.d(TAG, String.valueOf(bitmap));
                    ImageButton ib = (ImageButton) findViewById(R.id.inputImg);
                    ib.setImageBitmap(bitmap);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            break;
    }
}

当我尝试从 Dropbox 中选择图像时,代码有效,但是当我从图库中选择图像时,我得到

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

我为READ_EXTERNAL_STORAGE制作了一个清单的子项的 use-permission 标记:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="[REDACTED]">

    <uses-sdk
    android:minSdkVersion="14"
    android:targetSdkVersion="23" />

    <uses-permission tools:node="replace" android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

    <application>
        [REDACTED]
    </application>

</manifest>

我已经在其他帖子上搜索了高低,但似乎仍然无法弄清楚为什么我仍然得到这个讨厌的错误。


答案 1

问题
你有错误

java.lang.SecurityException: Permission Denial: read com.android.providers.media.MediaProvider uri content://media/external/images/media/35634 from pid=25240, uid=10070 requires android.permission.READ_EXTERNAL_STORAGE, or grantUriPermission().

原因
根据文档,您没有正确授予权限,因为 ,这是。android:maxSdkVersion="18"

应向应用授予此权限的最高 API 级别。如果从特定 API 级别开始不再需要应用所需的权限,则设置此属性非常有用。

只要你没有向 API 21 授予权限,你的应用就运行良好。

有关详细信息,请查看本主题

解决方案
如果要 API 21 下授予读取权限,则必须将其声明为:

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

重要:

这只有在您需要提供额外的权限时才有意义,因为某些旧 API 需要新版本不需要的权限,因此用户体验得到了改善,因为您只在需要时请求某些权限。


因此(在这种情况下),正确的方法是:

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

添加打开
如果要保存数据,则必须添加权限。WRITE_EXTERNAL_STORAGE

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

答案 2

只需替换为下面的一个并尝试,

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

推荐