Manejo de Fotos en Android: Permisos y Almacenamiento Local

Clase 23 de 33Curso de Android: Integración de APIs nativas

Resumen

Integrar correctamente la cámara en una aplicación Android requiere manejar cuidadosamente dos puntos clave: manejo de permisos y almacenamiento local de las fotos tomadas. A continuación veremos cómo lograr estos objetivos utilizando una interfaz llamada Photo Handler, cuya tarea principal será la gestión eficiente y ordenada del proceso.

¿Cómo se gestiona el almacenamiento de fotos con Photo Handler?

En primer lugar, se propone crear un paquete en la capa de Domain denominado Camera, dentro del cual se establecerá un archivo vital llamado Photo Handler. Esta interfaz definirá actividades específicas relacionadas con la cámara a través de funciones suspendidas (Suspend Functions). Entre las actividades definidas están:

  • Save Picture Preview: Guarda la foto actual como un archivo, posiblemente siendo nulo.
  • Uncancel Preview: Permite cancelar la previsualización existente.
  • Get Current Preview Photo: Expone el preview actual mediante un flujo (Flow) que puede devolver un ByteArray o nulo.
  • Clear Photos: Borra todas las imágenes guardadas localmente.
  • Unphoto Preview: Realiza una operación intermedia exponiendo un ByteArray.

Además, brinda acceso a una lista de fotos almacenadas mediante un flujo que manipula archivos directamente almacenados en el sistema.

¿Cuál es el flujo general para capturar y almacenar fotos?

Se plantea un proceso claramente definido para la captura y almacenamiento:

  1. Al tomar una foto mediante CameraX, se genera un preview inicial (ByteArray).
  2. Este preview se expone a través de un flujo usando Get Current Preview Photo.
  3. Si la foto es aceptada por el usuario, este ejecuta Save Picture Preview, convirtiendo el preview en un archivo permanente.
  4. Si no es aceptada, se permite cancelarla con Uncancel Preview.
  5. El método Get Photos se utiliza para obtener una lista completa de imágenes almacenadas previamente.
  6. Al finalizar el proceso y para liberar espacio o recursos, se invoca Clear Photos.

Cada método tiene su propósito específico, optimizando la experiencia del usuario y manteniendo un flujo eficiente de datos.

¿Cómo se implementa Photo Handler en el módulo de datos?

La implementación real ocurre en el módulo de Data, creando una clase responsable llamada HandlerImplementation que recibe el contexto de la aplicación como dependencia principal. Este contexto permite definir fácilmente un directorio llamado Fotos, donde efectivamente se guardarán las imágenes capturadas.

Se configura el acceso a las imágenes con la siguiente lógica: - Se verifica si el directorio principal existe, y si no está creado aún, con la función mkdirs() se genera automáticamente. - Se gestionan dos variables locales llamadas CurrentPreviewPhoto (un MutableStateFlow de ByteArray) y una lista MutableStateFlow para mantener registro de todas las fotos.

Para obtener imágenes guardadas, utiliza funciones específicas: - loadPhotos(): Carga las fotos guardadas filtrando por extensiones estándar (jpg, jpeg, png). - Ordena los resultados por fecha de modificación para obtener una visualización organizada.

La implementación core corresponde a los métodos definidos en la interfaz, aclarando qué ocurre con cada acción realizada por el usuario:

  • Al realizarse un onPhotoPreview, actualiza la foto actual del preview.
  • Con onCancelPreview, limpia la referencia del preview.
  • La función getPhotos devuelve las fotos almacenadas como flujo de estados.
  • clearPhotos maneja el borrado seguro de archivos, ejecutando dicha acción en un hilo separado mediante Dispatchers.IO.
  • Finalmente, el método safePicturePreview realiza la escritura del archivo físico real, añadiendo marcas de tiempo para una gestión más sencilla posterior.

Estos pasos contribuyen a una integración robusta y eficiente del manejo de cámara y almacenamiento en aplicaciones Android con buenas prácticas y un manejo efectivo de recursos.