Android READ_EXTERNAL_STORAGE permiso no funciona

Estoy tratando de crear una aplicación sencilla que puede obtener una imagen de la aplicación Galería y mostrarla en un imageButton. Estoy probando con API 21 en un teléfono con Android 5.0.1. Desafortunadamente, no importa lo que intento, sigo recibiendo un error de seguridad, incluso cuando especifico los permisos.

Mi código para obtener la recuperación de la imagen es:

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

El código funciona cuando intento seleccionar una imagen de Dropbox, pero cuando selecciono una imagen de la galería, obtengo

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

Hice la etiqueta del uso-permiso para READ_EXTERNAL_STORAGE un niño del 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> 

He buscado alto y bajo en otros puestos, pero todavía no puedo entender por qué sigo recibiendo este molestia error.

PROBLEMA
Tienes el error

Java.lang.SecurityException: Permiso Negación: lectura com.android.providers.media.MediaProvider uri contenido: // media / external / images / media / 35634 de pid = 25240, uid = 10070 r evalúa android.permission.READ_EXTERNAL_STORAGE o GrantUriPermission ().

PORQUE
No estás dando correctamente permisos debido a android:maxSdkVersion="18" , que según la documentación.

El nivel de API más alto en el que se debe conceder este permiso a tu aplicación. Establecer este atributo es útil si el permiso que requiere su aplicación ya no es necesario a partir de cierto nivel de API.

Siempre y cuando no hayas dado permisos a la API 21 tu aplicación se está comportando bien.

Consulte este tema para obtener más información.

SOLUCIÓN
Si desea otorgar permisos de lectura bajo la API 21 , debe declararlos como:

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

IMPORTANTE:

Esto sólo tiene sentido cuando se necesita dar permisos adicionales porque algunas api antiguas requieren permisos que no son nuevas versiones, por lo que la experiencia del usuario mejora, ya que solo solicita ciertos permisos cuando sea necesario.


Así (en este caso) la forma correcta será:

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

AÑADIR
Si desea guardar datos, debe agregar permisos WRITE_EXTERNAL_STORAGE .

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

Simplemente reemplazar con el siguiente y tratar,

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

Mientras depura en algunos dispositivos, necesitas conceder permiso explícitamente accediendo a tu configuración -> aplicaciones -> MY_APPLICATION -> Permisos y luego conceder permisos requeridos.

Además de agregar lo siguiente en AndroidManifest.xml

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

También necesitamos solicitar permiso en la actividad para que la aplicación tenga acceso al almacenamiento externo. https://developer.android.com/training/permissions/requesting.html

  • Obtención de error: "mala lectura de inttemp!" Al entrenar una nueva fuente en Tesseract 2
  • Android: cómo obtener el día actual de la semana (lunes, etc ...) en el idioma del usuario?
  • ¿Cómo resuelvo estos errores internos de Maven?
  • Conversión de coordenadas del dispositivo en coordenadas del mundo
  • Cómo convertir milisegundos a formato de fecha en android?
  • Error en la generación de Gradle en Android Studio
  • Base de datos no copiar desde activos
  • `static` y` non-static` campos para un mejor rendimiento en java Android
  • Si cualquier hilo de trabajo puede actualizar la interfaz de usuario en android?
  • JSON problema de análisis no resuelto
  • ¿Se asignan automáticamente nuevos subprocesos a un núcleo de CPU diferente en Java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.