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, seu 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 diferentes telas.

Por que a lógica do telefone falha

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

Orientação natural

  • Pressuposto:a orientação natural do dispositivo ROTATION_0 é sempre retrato.
  • Realidade:em tablets, na tela interna de alguns dispositivos dobráveis e em monitores de computador, ROTATION_0 geralmente está no modo paisagem.
  • Resultado:a visualização gira incorretamente em 90 graus
Figura 2. Visor da câmera antes e depois de aplicar a rotação correta.

Alinhamento do sensor

  • Pressuposto:a borda longa do sensor da câmera está alinhada com a 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 escalonamento correto.

Densidade e tamanho da tela

  • Pressuposto:a densidade e o tamanho da tela não mudam durante a 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 prejudica 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 de câmera).

Usar uma intent do sistema delega toda a experiência de captura ao app de câmera desenvolvido pelo fabricante de equipamento original (OEM) do dispositivo. Isso terceiriza a complexidade do suporte a formatos, incluindo:

  • Compatibilidade integrada com 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 funcionar 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 lente específica) que são difíceis ou impossíveis de replicar manualmente.

Solução 2: usar o Jetpack CameraX

O CameraX é uma biblioteca do Jetpack criada para facilitar o desenvolvimento de apps de câmera. A CameraX é compatível com o ciclo de vida e orientada à superfície. Ao contrário do Camera2, que exige o recálculo manual da orientação do sensor e dos tamanhos de superfície sempre que um dispositivo é dobrado, girado ou redimensionado, o CameraX processa automaticamente a reconfiguração das sessões de 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 esticamentos.

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 oferecer suporte a uma ampla variedade de hardware com uma única implementação consistente, em vez de uma coleção intrincada 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 processar a geometria complexa de redimensionamento, rotação e proporções na vida útil 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 de criar 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. O CameraXViewfinder fornece um CoordinateTransformer que processa os cálculos matemáticos 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: o CameraXViewfinder processa internamente a lógica de corte central x ajuste central, garantindo que a prévia não seja esticada quando a janela do app é redimensionada para proporções não padrão (por exemplo, modo de tela dividida ou janela de computador).

Visualizações

Em apps baseados em visualização, use PreviewView ou ViewFinderView. Se você usar SurfaceView ou TextureView diretamente, calcule a proporção e aplique a matriz de transformação correta por conta própria.

Solução 3: processar orientação e 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 da tela.

Parar de usar a rotação do dispositivo

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

  • Use métricas de janela: determine seu layout (interface do usuário paisagem x retrato) comparando a largura e a altura da janela do app usando WindowManager#getCurrentWindowMetrics().
  • Ignorar orientação natural: seu app pode estar em uma janela no formato retrato em um monitor 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). Em apps de câmera, isso aparece como uma oscilação na tela ou uma conexão interrompida durante videochamadas.

Proporção e corte

Um problema comum em dobráveis e janelas de computador é o esticamento da visualização, em que um feed de câmera 4:3 é forçado 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): dimensiona a prévia para preencher a menor dimensão da janela e corta o excesso. Isso garante que o assunto permaneça sem distorção e preencha o quadro.
  • Ajustar ao centro (alternativa): se for essencial mostrar todo o campo de visão (por exemplo, ao digitalizar um documento), coloque a prévia em letterbox dentro da janela.
  • Ajustar ao centro (alternativa): se for essencial mostrar todo o campo de visão (por exemplo, ao digitalizar um documento), coloque a prévia em letterbox dentro da janela.

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

Os dispositivos dobráveis não são apenas smartphones que dobram. Eles oferecem estados de hardware exclusivos que podem melhorar fundamentalmente a forma 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 mais longas, fotografia 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 fica 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 têm qualidade superior às câmeras frontais. O modo de tela traseira permite que o usuário abra o dispositivo e o gire, 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 50 MP ou mais, fotos de grupo ultralargas e vlogs de alta qualidade sem precisar carregar equipamentos extras.

Modo Dual Screen (prévia de assunto)

  • O modo Dual Screen permite mostrar a prévia da câmera nas telas interna e externa simultaneamente. Isso é perfeito para fotografar pessoas: os modelos 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 de tela dupla cria uma janela de apresentação secundária na tela da capa.
Figura 5. Um app de câmera no modo Dual Screen.