No se puede acceder a la carpeta oculta en un dispositivo Android con la versión 11 en Flutter.
Estoy haciendo una aplicación que muestra los estados de WhatsApp. El estado de WhatsApp se almacena en un archivo oculto llamado “.statuses” en la carpeta de WhatsApp. Pero cuando intento obtener una lista de subdirectorios y archivos de la carpeta .statuses, obtengo una cadena vacía.
Este problema solo ocurre en dispositivos con la versión 11 de Android. El código funciona perfectamente bien para carpetas que no están ocultas y para dispositivos que tienen una versión de Android inferior a 11.
Mi código está adjunto a continuación:
final Directory _photoDir =
Directory('/storage/emulated/0/Android/media/com.whatsapp/WhatsApp/Media/.Statuses');
var imageList = _photoDir
.listSync()
.map((item) => item.path)
.where((item) => item.endsWith(".jpg"))
.toList(growable: false);
print(imageList);
davy.ai
Solución
El problema se produce porque en Android 11, algunos de los directorios específicos de la aplicación no son visibles para otras aplicaciones, incluso si tienen los permisos necesarios. Para acceder a estos directorios, necesitas utilizar el
Marco de acceso al almacenamiento
.Aquí están los pasos para acceder a las carpetas ocultas:
getExternalStorageDirectories()
para obtener la lista de directorios de almacenamiento externo.Itera sobre cada directorio y verifica si tiene la carpeta requerida (.Statuses) utilizando el método
Directory.existsSync()
.Si la carpeta existe, obtén su Uri llamando al método
StorageVolume.createAccessIntent()
.Inicia la actividad utilizando el método
startActivityForResult()
y escucha la devolución de llamadaonActivityResult()
.En la devolución de llamada, obtén el uri del directorio seleccionado utilizando el parámetro de datos.
Por último, utiliza el método
DocumentFile.fromTreeUri()
para crear unDocumentFile
a partir del uri y acceder a los archivos en el directorio.Aquí tienes un ejemplo de cómo modificar tu código existente para acceder a la carpeta oculta
.Statuses
:Nota: Debes agregar el siguiente permiso a tu archivo
AndroidManifest.xml
:Además, no olvides importar los paquetes necesarios:
“`dart
import ‘dart:io’;
import ‘package:android_intent/android_intent.dart’;
import ‘package:flutter/material.dart’;
import ‘package:flutter/services.dart’;
import ‘package:flutter_document_picker/flutter_document_picker.dart’;
import ‘package:permission_handler/permission_handler.dart’;
import ‘package:flutter_document_picker/document_picker.dart’;
import ‘package:path_provider/path_provider.dart’;
“`