Publicado por Francesco Romano, ingeniero de relaciones con desarrolladores, AndroidA lo largo de los años, los dispositivos Android han evolucionado para incluir una variedad de tamaños, formas y pantallas, entre otras características. Sin embargo, desde el principio, tomar fotografías con su teléfono ha sido uno de los casos de uso más importantes. Hoy en día, las capacidades de la cámara siguen siendo una de las principales razones por las que los consumidores compran un teléfono.
Como desarrollador, desea aprovechar las funciones de la cámara en su aplicación, por lo que decide adoptar Android Camera Framework. El primer caso de uso que desea implementar es el Avance caso de uso, que muestra la salida del sensor de la cámara en la pantalla.
Así que adelante y crea un archivo. sesión de captura usando un área tan grande como el tamaño de la pantalla. Siempre que la pantalla tenga la misma relación de aspecto que la salida del sensor de la cámara y el dispositivo permanezca en su orientación de retrato natural, debería estar bien.
Pero, ¿qué sucede cuando cambia el tamaño de la ventana, abre el dispositivo o cambia la visualización o la orientación? Bueno, en la mayoría de los casos, la vista previa puede verse estirada, volteada o girada incorrectamente. Y si está en un entorno de múltiples ventanas, su aplicación puede incluso bloquearse.
¿Por qué pasó esto? Debido a las suposiciones implícitas que hizo al crear CaptureSession.
Históricamente, su aplicación podía vivir en la misma ventana durante todo su ciclo de vida, pero con la disponibilidad de nuevos factores de forma, como dispositivos plegables y nuevos modos de visualización, como ventanas múltiples y pantallas múltiples, no puede suponer que esto sucederá de manera más cierta. .
En particular, veamos algunas de las consideraciones más importantes al desarrollar una aplicación dirigida a varios factores de forma:
Veamos algunas trampas comunes que se deben evitar al desarrollar una aplicación que apunta a varios factores de forma:
- No asuma que su aplicación vivirá en una ventana vertical. La solicitud de una orientación fija todavía se admite en Android 13, pero los fabricantes de dispositivos ahora pueden tener la capacidad de anular una solicitud de aplicación para una orientación preferida.
- No asumas un tamaño fijo o una relación de aspecto para tu aplicación.. Incluso si configura resizableActivity = “false”, su aplicación aún se puede usar en modo de múltiples ventanas en pantallas grandes (> = 600 dp).
- No suponga una relación fija entre la orientación de la pantalla y la cámara. los Documento de definición de compatibilidad de Android especifica que el sensor de imagen de una cámara “DEBE estar orientado de modo que la dimensión larga de la cámara esté alineada con la dimensión larga de la pantalla”. A partir del nivel 32 de API, los clientes de cámara que soliciten orientación en dispositivos plegables pueden recibir un valor que cambia dinámicamente según el estado del dispositivo/pliegue.
- No asuma que el tamaño del inserto no puede cambiar. La nueva barra de tareas se informa a las aplicaciones como un recuadro, y cuando se usa con la navegación por gestos, la barra de tareas se puede ocultar y mostrar dinámicamente.
- No asuma que su aplicación tiene acceso exclusivo a la cámara. Mientras su aplicación se encuentra en un estado de múltiples ventanas, otras aplicaciones pueden obtener acceso a recursos compartidos como la cámara y el micrófono.
Si bien CameraX ya maneja la mayoría de los casos anteriores, implementar una vista previa que funcione en diferentes escenarios con la API de Camera2 puede ser complejo, como describimos en Admite superficies redimensionables en su aplicación de cámara Codelab.
¿No sería genial tener un componente simple que se encargue de estos detalles y te permita concentrarte en la lógica específica de tu aplicación?
no digas nada mas…
Presentación CámaraVisor
CámaraVisor es un nuevo artefacto de la biblioteca Jetpack que le permite implementar rápidamente vistas previas de cámara con un mínimo esfuerzo. Usa TextureView o SurfaceView internamente para mostrar las imágenes de la cámara y aplicarles las transformaciones necesarias para mostrar el visor correctamente. Esto implica corregir la relación de aspecto, la escala y la rotación. Es totalmente compatible con el código base existente de Camera2 y se prueba continuamente en diferentes dispositivos.
Veamos cómo usarlo.
Primero, agregue la dependencia en su archivo build.gradle a nivel de aplicación:
Sincroniza tu proyecto. Ahora debería poder usar CameraViewfinder directamente como cualquier otro Vista. Por ejemplo, puede agregarlo a su archivo de diseño:
Como puede ver, CameraViewfinder tiene los mismos controles disponibles en Vista previaVerpara que puedas elegir diferentes Métodos de implementación Y tipos de escala.
Ahora que el componente es parte del diseño, aún puede crear un archivo CámaraCapturarSesiónpero en lugar de proporcionar TextureView o SurfaceView como superficies de destino, utilice el resultado de requestSurfaceAsync().
Bonificación: diseños optimizados para dispositivos plegables
CameraViewFinder está listo para usar en superficies redimensionables, cambios de configuración, rotaciones y modos de múltiples ventanas y ha sido probado en muchos dispositivos plegables.
Pero si desea implementar diseños optimizados para dispositivos plegables y de pantalla dual, puede combinar CameraViewFinder con el Administrador de ventanas de Jetpack biblioteca para ofrecer experiencias únicas a tus usuarios.
Por ejemplo, puede optar por no mostrar la vista previa de pantalla completa si hay una bisagra en el centro de la pantalla o si el dispositivo está en modo “libro” o “sobremesa”. En estos escenarios, puede tener el visor en un lado de la pantalla y los controles en el otro lado, o puede usar un lado de la pantalla para mostrar las fotos tomadas más recientemente. ¡La imaginación es el límite!
La aplicación de muestra ya está optimizada para dispositivos plegables y puede encontrar código para manejar cambios de postura aquí. ¡Echar un vistazo!