Suporte a câmera em vários formatos

Os apps Android são executados em mais formatos do que apenas smartphones no modo retrato. Com a introdução do Modo Janela para Computador, telas conectadas e dispositivos dobráveis, o app de câmera precisa se adaptar a tamanhos de janela dinâmicos, proporções variadas e hardware externo.

Figura 1. Exemplo de apps de câmera em telas diferentes.

Por que a lógica do smartphone falha

Os apps de câmera geralmente fazem suposições que causam falhas críticas em ambientes de vários formatos.

Orientação natural

  • Suposição: a orientação natural do dispositivo ROTATION_0 é sempre retrato.
  • Realidade:em tablets, display interno de alguns dispositivos dobráveis e monitores de computador, ROTATION_0 geralmente é paisagem.
  • Resultado:a visualização é girada incorretamente em 90 graus.
Figura 2. Visor da câmera antes e depois de aplicar a rotação correta.

Alinhamento do sensor

  • Suposição:a borda longa do sensor da câmera se alinha à borda longa da tela.
  • Realidade:uma janela redimensionável pode ser quadrada ou paisagem, enquanto o sensor permanece fixo (geralmente 4:3).
  • Resultado:imagens esticadas ou distorcidas.
Figura 3. Visor da câmera antes e depois de aplicar o fator de escala correto.

Densidade e tamanho da tela

  • Suposição:a densidade e o tamanho da tela não mudam no momento da execução.
  • Realidade:em ambientes de computador, os usuários redimensionam as janelas livremente.
  • Resultado:reiniciar a sessão da câmera em cada evento de arrastar interrompe a experiência do usuário e pode causar falhas.

Solução 1: usar intents do sistema

Se o app precisar tirar uma foto ou gravar um vídeo, mas não exigir uma interface de câmera personalizada especializada, a melhor maneira de lidar com diferentes formatos é iniciar a câmera do sistema pré-instalada do dispositivo (consulte Intents da câmera).

O uso de um intent do sistema delega toda a experiência de captura ao app de câmera desenvolvido pelo fabricante do equipamento original (OEM, na sigla em inglês) do dispositivo. Isso terceiriza efetivamente a complexidade do suporte a formatos, incluindo:

  • Suporte integrado a redimensionamento e rotação : o app de câmera padrão em um dispositivo dobrável ou tablet é criado explicitamente pelo fabricante para lidar com a geometria específica do dispositivo. O app foi projetado para se comportar corretamente quando o dispositivo é desdobrado, girado ou colocado no modo de várias janelas.
  • Acesso a recursos avançados de hardware : os apps de câmera OEM têm acesso exclusivo a algoritmos ajustados por hardware (modo noturno, HDR, troca de lentes específicas) que são difíceis ou impossíveis de replicar manualmente.

Solução 2: usar o CameraX do Jetpack

O CameraX é uma biblioteca do Jetpack criada para facilitar o desenvolvimento de apps de câmera O CameraX reconhece o ciclo de vida e é orientado à superfície. Ao contrário do Camera2, que exige o recálculo manual da orientação do sensor e dos tamanhos da superfície sempre que um dispositivo é dobrado, girado ou redimensionado, o CameraX processa automaticamente a reconfiguração das sessões da câmera durante o redimensionamento de várias janelas ou quando um app é movido para uma tela conectada, garantindo que o fluxo de visualização se adapte sem travamentos ou alongamentos.

Componentes como PreviewView gerenciam de maneira inteligente a proporção e os tipos de escala em diferentes estados, como um dispositivo dobrável que faz a transição da tela de capa para a tela interna. Isso permite que você ofereça suporte a uma variedade de hardware com uma implementação única e consistente, em vez de uma coleção complexa de casos extremos específicos do dispositivo.

Escrever

Com o Jetpack Compose, use a biblioteca dedicada androidx.camera:camera-compose. A biblioteca fornece o elemento combinável CameraXViewfinder, que foi projetado especificamente para lidar com a geometria complexa de redimensionamento, rotação e proporções no ciclo de vida do Compose.

O componente CameraXViewfinder elimina as fontes mais comuns de erros em apps de câmera:

  • Transformação automática de coordenadas : uma das partes mais difíceis da criação de um app de câmera é mapear o toque de um usuário (coordenadas x, y na tela) para o sistema de coordenadas do sensor da câmera (0-1, 0-1 girado) para foco e medição. CameraXViewfinder fornece um CoordinateTransformer que processa o cálculo automaticamente, mesmo quando a janela é redimensionada ou o dispositivo é dobrado.
  • Comportamento correto do layout : ao contrário de SurfaceView ou TextureView, CameraXViewfinder funciona corretamente com a ordenação z do Compose. É possível sobrepor elementos da interface (anéis de foco, controles) ou aplicar modificadores (cantos arredondados, animações) sem renderizar artefatos.
  • Redimensionamento e proporção: CameraXViewfinder processa internamente a lógica de _corte central_ em comparação com o _ajuste central_, garantindo que a visualização não seja esticada quando a janela do app é redimensionada para proporções não padrão (por exemplo, modo de tela dividida ou Modo Janela para Computador).

Visualizações

Em apps baseados em visualização, use PreviewView ou ViewFinderView. Se você usar SurfaceView ou TextureView diretamente, será necessário calcular a proporção e aplicar a matriz de transformação correta.

Solução 3: processar a orientação e o redimensionamento de forma dinâmica

Ao usar APIs da plataforma diretamente, lembre-se da rotação do dispositivo, das reinicializações de atividades e da proporção.

Parar de usar a rotação do dispositivo

Não dependa apenas de Display#getRotation() ou da orientação do sensor físico para determinar o layout da interface.

  • Usar métricas de janela : determine o layout (interface no modo paisagem ou retrato UI) comparando a largura e a altura da janela do app usando WindowManager#getCurrentWindowMetrics().
  • Ignorar a orientação natural : seu app pode estar em uma janela no formato retrato em um monitor no modo paisagem. A orientação do dispositivo é irrelevante para os limites da interface.

Evitar reinicializações de atividades

O comportamento padrão do Android destrói a atividade do app em mudanças de configuração (como redimensionamento de janela). Para apps de câmera, isso aparece como uma oscilação de tela ou uma conexão interrompida durante videochamadas.

Proporção e corte

Um problema comum em dispositivos dobráveis e janelas de computador é o alongamento da visualização, em que uma transmissão da câmera 4:3 é forçada a entrar em uma janela 16:9 ou 1:1.

  • Não esticar : nunca force o buffer da câmera a corresponder exatamente aos limites da visualização se as proporções da visualização e da janela forem diferentes.
  • Corte central (recomendado) : dimensione a visualização para preencher a dimensão mais curta da janela e corte o excesso. Isso garante que o assunto permaneça sem distorção e preencha o frame.
  • Ajuste central (alternativa) : se for fundamental mostrar todo o campo de visão (por exemplo, ao digitalizar um documento), aplique o efeito letterbox na visualização dentro da janela.

Bônus: suporte a experiências para dispositivos dobráveis

Os dispositivos dobráveis não são apenas smartphones que se dobram. Eles também oferecem estados de hardware exclusivos que podem melhorar fundamentalmente a maneira como os usuários tiram fotos e gravam vídeos. Em vez de tratar a dobra como um problema a ser resolvido, use-a para criar recursos impossíveis em dispositivos não dobráveis.

Modo de mesa (captura com viva-voz)

O modo de mesa permite que os usuários dobrem o dispositivo pela metade e o coloquem em uma superfície para videochamadas estendidas, fotografia em time-lapse e fotografia noturna de longa exposição.

Figura 5. Um app de comunicação no modo de mesa: o visor da câmera está na parte de cima da dobradiça e os controles na parte de baixo.

Modo de tela traseira (selfies de alta qualidade)

  • Em dispositivos dobráveis, as câmeras traseiras geralmente são de qualidade superior às câmeras voltadas para o usuário. O modo de tela traseira permite que o usuário desdobre o dispositivo e o vire, usando a pequena tela de capa como um visor ao vivo para a câmera traseira principal.
  • O modo de tela traseira permite selfies de mais de 50 MP, fotos de grupo ultra-wide e vlogging de alta qualidade sem precisar carregar equipamentos extras.

Modo Dual Screen (visualização do assunto)

  • O modo Dual Screen permite mostrar a visualização da câmera nas telas interna e externa simultaneamente. Isso é perfeito para fotografar pessoas: os assuntos da foto podem se ver na tela externa e ajustar a pose enquanto você enquadra a foto na tela interna.
  • Ao contrário do modo de tela traseira (que move o app inteiro), o modo Dual Screen cria uma janela de apresentação secundária na tela de capa.
Figura 5. Um app de câmera no modo Dual Screen.