Android READ_EXTERNAL_STORAGE 权限无效

Android READ_EXTERNAL_STORAGE permission not working

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

我获取图像的代码是:

@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;
    }
}

当我尝试 select 来自 Dropbox 的图像时代码有效,但是当我 select 来自画廊的图像时,我得到

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 的使用许可标记设为清单的子项:

<?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>

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

换成下面的试试,

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

问题
你有错误

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().

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

The highest API level at which this permission should be granted to your app. Setting this attribute is useful if the permission your app requires is no longer needed beginning at a certain API level.

只要您没有授予 API 21 权限,您的应用就可以正常运行。

查看 this topic 了解更多信息。

解决方案
如果您想在 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" />

在某些设备上进行调试时,您需要通过转到设置 --> 应用程序 --> MY_APPLICATION --> 权限来明确授予权限,然后授予所需的权限。

除了在 AndroidManifest.xml

中添加以下内容
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

我们还需要在 activity 中请求权限,应用才能真正访问外部存储。 https://developer.android.com/training/permissions/requesting.html