CameraX: uma introdução

Nós exploramos a resposta do Google à complexidade das APIs da câmera

Alistair Sykes Seg. 15 de jul · 4 min ler

História

Android começou com android.hardware.Camera . Este foi um conjunto simples de APIs que permitiram aos desenvolvedores implementar rapidamente um recurso de câmera em seu aplicativo. Mas tendo sido adicionado novamente no Android SDK 1, eles começaram a ficar desatualizados. O mercado mudou e os usuários começaram a exigir muito mais da câmera do celular.

O Android apresentou as APIs do Camera2. Isso deu aos fabricantes e desenvolvedores a capacidade de adicionar recursos de câmera mais complexos. Apesar de uma API abrangente, muitos desenvolvedores acharam complicado demais implementar para um caso de uso simples.

CameraX

Reconhecendo a complexidade da Camera2, o Google lançou agora uma biblioteca Jetpack CameraX. Este conjunto de APIs envolve as APIs Camera2. O CameraX introduz a ideia de casos de uso. Esses casos de uso envolvem todo um conjunto de funcionalidades em uma API simples.

Casos de uso

O CameraX está sendo lançado com três casos de uso. Preview, que está recebendo uma imagem em um display. Análise de imagem, que dá acesso a um fluxo de imagens para uso em seus algoritmos, como passar para o MLKit. Captura de imagem, para salvar imagens de alta qualidade.

Esses 3 casos de uso cobrirão a grande maioria das necessidades dos desenvolvedores. Eles podem ser combinados ou usados individualmente.

Reduzindo a complexidade

O CameraX não apenas fornece casos de uso, mas também elimina todas as nuances específicas do dispositivo. O Android está investindo em um laboratório de testes automatizado para garantir que todas as APIs do CameraX se comportem da mesma forma. Independentemente de qual dispositivo você está.

Características

É claro que o Android não quer reduzir o número de recursos disponíveis para os fabricantes (incluindo eles próprios para a gama Pixel). Para atender a esses recursos estranhos e maravilhosos da câmera, eles criaram uma API de extensões. Com essa API, você pode consultar a disponibilidade de um determinado ramal e ativá-lo. Se não estiver disponível, os fallbacks graciosos serão usados.

Captura de imagem

Dependências

Primeiro, você precisa adicionar as dependências necessárias. Assegure-se de incluir ambos, mesmo que o segundo possa parecer opcional na documentação do desenvolvedor.

Se você não adicionar o segundo, verá uma exceção como esta:

Caused by: java.lang.IllegalStateException: CameraX not initialized yet.

TextureView

Em seguida, você precisará adicionar um TextureView simples ao seu layout de fragmento ou atividades.

Permissões

Você precisará solicitar o android.permission.CAMERA como você espera.

Depois de ter permissão, podemos iniciar a câmera.

Iniciar câmera

Observe que nós chamamos startCamera() dentro de um post no TextureView . Isso é para garantir que o TextureView tenha sido inflado.

Usamos o PreviewConfig.Builder e o ImageCaptureConfig.Builder para configurar nossos casos de uso. Existem muitas opções de configuração para fazer check-out.

Usamos setOnPreviewOutputUpdateListener() para adicionar a visualização ao nosso TextureView . No entanto, temos que remover e adicionar TextureView nosso TextureView ao layout. Isso ocorre porque o TextureView cria internamente seu próprio SurfaceTexture quando é anexado ao pai. Se você não fizer isso, não verá uma prévia da câmera e receberá uma mensagem nos registros de erros: SurfaceTexture is not attached to a View

Atualizar Transformação

Em updateTransform() , corrigimos as alterações na orientação do dispositivo.

Capturar

Para capturar uma imagem, usamos o ImageCapture que criamos em startCamera() e chamamos takePicture() . Precisamos passar um File e um OnImageSavedListener .

Leitor de códigos de barra

Para escanear códigos de barras em tempo real, fazemos uso do caso de uso de análise de imagem.

Configuração do Firebase

Além das dependências do CameraX, você precisa seguir a configuração detalhada aqui .

Scanner

A maior parte do restante do código corresponde à captura de imagem detalhada acima.

Notavelmente, temos o ImageAnalysisConfig.Builder , que dá acesso ao fluxo de imagens vindas da câmera.

Chamamos setAnalyzer() para adicionar um Analyzer que é onde vamos chamar o Firebase ML. Nós usamos fromMediaImage() para obter um FirebaseVisionImage e passá-lo para o FirebaseVisionBarcodeDetector .

Dicas

No trecho acima, temos um AtomicBoolean . Isso rastreia se o Firebase está processando atualmente um código de barras. Isso é para que não processemos um novo quadro enquanto um quadro anterior ainda está sendo processado.

Também verificamos se o Lifecycle.State impediu que o Firebase continuasse a processar os quadros antes que o ciclo de vida fosse retomado.

Resumo

A biblioteca CameraX trouxe muita simplicidade de volta ao universo da câmera. Ele simplifica o código para a maioria dos casos de uso, enquanto ainda fornece os recursos de nicho.

Parecia natural usar e ter um bom desempenho (escrito no momento de alfa02). Alguns recursos ainda parecem um pouco complicados, por exemplo, tocar para focar. Mas, esperançosamente, à medida que essa biblioteca progride, esses recursos serão abordados.

Fontes

https://developer.android.com/training/camerax https://codelabs.developers.google.com/codelabs/camerax-getting-started/ https://github.com/android/camera/tree/master/CameraXBasic https://firebase.google.com/docs/ml-kit/android/read-barcodes

Postagem anterior