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!
- Cómo cambiar programaticamente la configuración WiFi en Android 6 (M)?
- SMSMessage createFromPdu con formato de parámetro adicional
- Una aplicación de Android recuerda sus datos después de desinstalar y reinstalar
- Ni el usuario 10102 ni el proceso actual tienen android.permission.READ_PHONE_STATE
- Android Marshmallow ART "No se pudo encontrar el offset nativo para dex" crash
Puedo usar la cáscara del anuncio para enumerar archivos de la imagen en el emulador:
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.
- Librería de Lvl y melcocha de android
- Error de permiso de almacenamiento en Marshmallow
- Android M escribe en la tarjeta SD - Permiso denegado
- DrawerLayout deja de funcionar correctamente después de la actualización a Android 6.0.1
- Android 6 Marshmallow: las solicitudes de algunos permisos específicos se deniegan al instante sin mostrar ningún ui
- Opción de fuente de audio en la opción de desarrollador en Android M
- Apache conexión HTTP con Android 6.0 (Marshmallow)
- Android M onRequestPermissionsResult en no actividad
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();
- Android Drawer Layout no puede encontrar R.layout.drawer_list
- Google Play: hemos encontrado SDK de anuncios en tu aplicación