安卓READ_EXTERNAL_STORAGE权限无效

14

我想创建一个简单的应用程序,可以从“相册”应用程序获取图像,并在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 的 use-permission 标签作为 manifest 的子标签进行了设置:

<?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
请阅读以下链接:https://dev59.com/83vaa4cB1Zd3GeqPDHHU 或 https://dev59.com/W2Ij5IYBdhLWcg3w04bd - Michele Lacorte
4个回答

15

问题
您遇到了错误。

java.lang.SecurityException: 权限拒绝:从pid=25240,uid=10070读取com.android.providers.media.MediaProvider uri content://media/external/images/media/35634需要android.permission.READ_EXTERNAL_STORAGE或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" />

我发誓昨晚在没有工具和maxsdk的情况下尝试权限时它没有起作用,现在它像什么都没发生一样合作了。非常感谢! - Zheryu

2

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


2

只需用下面的代码替换,然后尝试一下:

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

0

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