Android READ_EXTERNAL_STORAGE权限无效

时间:2015-09-02 10:38:44

标签: java android android-5.0-lollipop android-gallery android-permissions

我正在尝试创建一个简单的应用,可以从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创建了一个使用权限标记: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>

我在其他帖子中搜索过高低,但仍然无法弄清楚为什么我仍然会遇到这个麻烦的错误。

4 个答案:

答案 0 :(得分:14)

<强>问题
你有错误

  

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

<强>原因
由于android:maxSdkVersion="18",您未根据文档提供正确的权限。

  

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

只要你没有授予 API 21 的权限,你的应用就会表现不错。

检查this topic以获取更多信息。

<强>解
如果您想在 {strong> API 21 下提供读取权限,则必须将其声明为:

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

重要:

只有当你需要提供额外的权限才有意义,因为一些旧的api需要新版本没有的权限,因此用户体验得到了改善,因为你只需要在需要时获得某些权限。 < / p>

所以(在这种情况下)正确的方法是:

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

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

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

答案 1 :(得分:2)

只需替换下面的一个,然后尝试,

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

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

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