ListFiles () devuelve null en el emulador de Android 6.0

Quiero leer archivos jpeg de sdcard en el emulador de Android 6.0, pero la lista de archivos devuelve null. El código de ejemplo puede funcionar en mi teléfono:

String sdcard = Environment.getExternalStorageDirectory().toString(); File sdcard_dir = new File(sdcard); if (sdcard_dir.isDirectory()) { File[] fileNames = sdcard_dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.toString().endsWith(".jpg") ? true : false; } }); } 

FileNames = null!

Puedo usar la cáscara del anuncio para enumerar archivos de la imagen en el emulador:

Introduzca aquí la descripción de la imagen

El permiso se ha añadido a AndroidManifest.xml:

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

¿Algo más que pueda hacer?

Tengo que usar el emulador porque mi dispositivo no se puede actualizar a Android 6.0 hasta ahora, y quiero probar algunas API nuevas.

Android 6.0 introdujo permisos de tiempo de ejecución. Además de declarar el permiso en su manifiesto, debe solicitar el permiso del usuario en tiempo de ejecución.

Más información y tutoriales aquí: http://developer.android.com/training/permissions/requesting.html

He observado exactamente el mismo problema, incluso después de agregar el código de permisos de tiempo de ejecución necesario con Android 6.0.

En mi actividad tengo el código siguiente:

  int permissionCheck1 = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_EXTERNAL_STORAGE); int permissionCheck2 = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE); if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READWRITE_STORAGE); } 

Y recibo la devolución de llamada esperada cuando el usuario confirma la solicitud para los permisos de almacenamiento de lectura / escritura.

 @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) { if (requestCode == REQUEST_READWRITE_STORAGE) { if ((grantResults.length > 0) && (grantResults[0] == PackageManager.PERMISSION_GRANTED)) { finishCreationStep(); } } } 

He verificado en el depurador que los permisos de lectura y escritura se han concedido. Sin embargo, la llamada ejecutada posteriormente para leer el almacenamiento falla:

 File[] possible_files = mrpDir.listFiles(); 

La llamada a listFiles () devuelve null. Si termino la aplicación y accede a Ajustes> Aplicaciones para mi aplicación, veo que se ha concedido el permiso de almacenamiento. Si también termino la aplicación y, a continuación, volver a iniciarla, los permisos están allí, como se esperaba, y las llamadas listFiles () funciona bien. Por lo tanto, en otras palabras, el cambio de permisos no surtirá efecto hasta que la aplicación se termine y vuelva a iniciarse. ¿Hay alguna forma de que la aplicación reconozca los permisos modificados sin tener que hacer que el usuario termine y vuelva a iniciarlo manualmente?

Al igual que con el creador de este hilo, estoy corriendo con un emulador API 23, ya que actualmente no tengo acceso a un dispositivo Android 6. Así que supongo que es posible que haya un problema con el emulador. Pero eso parece improbable.

Su primera llamada

 if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READWRITE_STORAGE); } 

Es comprobar si usted tiene el permiso. SI no tiene, el permiso, callback se llama. Es la primera vez.

Posteriormente, la devolución de llamada no se llama ya que ya tiene el permiso. Por lo tanto, su código debe verse como

 if (permissionCheck1 != PackageManager.PERMISSION_GRANTED || permissionCheck2 != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE}, REQUEST_READWRITE_STORAGE); } else finishCreationStep(); 
  • getAllNetworkInfo () está obsoleto en M, pero su sustitución tiene un comportamiento diferente
  • Sustitución de la aplicación de llamada
  • ¿Cómo inhabilitar una aplicación del modo Doze?
  • Desafortunadamente, Package Installer se ha detenido mientras solicitaba permiso en Marshmellow
  • ¿Cómo cambiamos MTP más fácilmente en un dispositivo Debug-Enabled Android 6.0?
  • ¿Cómo prueban los desarrolladores comunes isPermissionRevokedByPolicy ()?
  • ¿Está disponible para establecer checkSelfPermission en SDK mínimo <23?
  • Android 5.1.1 y superior - getRunningAppProcesses () sólo devuelve mi paquete de aplicaciones
  • Android 6.0 no está autorizado a actualizar la red inalámbrica cuando se reinstala la aplicación
  • Wake bloqueo desactivado en servicio de primer plano con el modo Doze - nuevas optimizaciones de la batería en Android M
  • Android 23 No genera el archivo de manifiesto para usos-elementos de permiso
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.