es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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);
Tags:  , , , ,

Answer

  1. Avatar for 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:

    1. Utiliza el método getExternalStorageDirectories() para obtener la lista de directorios de almacenamiento externo.
    2. Itera sobre cada directorio y verifica si tiene la carpeta requerida (.Statuses) utilizando el método Directory.existsSync().

    3. Si la carpeta existe, obtén su Uri llamando al método StorageVolume.createAccessIntent().

    4. Inicia la actividad utilizando el método startActivityForResult() y escucha la devolución de llamada onActivityResult().

    5. En la devolución de llamada, obtén el uri del directorio seleccionado utilizando el parámetro de datos.

    6. Por último, utiliza el método DocumentFile.fromTreeUri() para crear un DocumentFile 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:

    final List<directory> _storageDirs = await getExternalStorageDirectories();
    
    for (Directory dir in _storageDirs) {
      final Directory whatsappDir = Directory('${dir.path}/Android/media/com.whatsapp/WhatsApp/Media/.Statuses');
      if (whatsappDir.existsSync()) {
        final Intent intent = Intent()
          ..setAction(Intent.ACTION_OPEN_DOCUMENT_TREE);
        final permissions = <string>[READ_EXTERNAL_STORAGE];
        final uri = await startActivityForResult(intent, permissions: permissions);
    
        final DocumentFile documentFile = DocumentFile.fromTreeUri(context, uri);
        final List<documentfile> imageFiles = await documentFile.listDocuments();
    
        final imageList = imageFiles
            .map((item) => item.uri.toString())
            .where((item) => item.endsWith(".jpg"))
            .toList(growable: false);
    
        print(imageList);
        break;
      }
    }
    

    Nota: Debes agregar el siguiente permiso a tu archivo AndroidManifest.xml:

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

    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’;
    “`

Comments are closed.