Android READ_EXTERNAL_STORAGE 权限不起作用

Posted

技术标签:

【中文标题】Android READ_EXTERNAL_STORAGE 权限不起作用【英文标题】:Android READ_EXTERNAL_STORAGE permission not working 【发布时间】:2015-11-27 19:56:47 【问题描述】:

我正在尝试创建一个简单的应用程序,该应用程序可以从 Gallery 应用程序中获取图像并将其显示在 imageButton 上。我正在运行 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 的使用权限标记设为清单的子项:

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

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

【问题讨论】:

阅读本文***.com/questions/21196453/… 或***.com/questions/19837358/… 【参考方案1】:

问题 你有错误

java.lang.SecurityException: Permission Denial: 读取 com.android.providers.media.MediaProvider uri content://media/external/images/media/35634 from pid=25240, uid=10070 r需要 android .permission.READ_EXTERNAL_STORAGE,或 grantUriPermission()。

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

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

只要您没有向 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" />

【讨论】:

我发誓昨晚我在没有工具和 maxsdk 的情况下尝试许可时它不起作用,现在它正在合作,就像什么都没发生过一样。非常感谢!【参考方案2】:

换成下面的试试,

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

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

除了在AndroidManifest.xml中添加以下内容

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

我们还需要在 Activity 中请求权限,以便应用实际访问外部存储。 https://developer.android.com/training/permissions/requesting.html

【讨论】:

以上是关于Android READ_EXTERNAL_STORAGE 权限不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

Android 逆向Android 权限 ( Android 逆向中使用的 android.permission 权限 | Android 系统中的 Linux 用户权限 )

android 21 是啥版本

Android逆向-Android基础逆向(2-2)

【Android笔记】android Toast

图解Android - Android核心机制