O Google tem o compromisso de promover a igualdade racial para as comunidades negras. Saiba como.

Extensões do fornecedor CameraX

Os fabricantes de dispositivos podem implementar a biblioteca do fornecedor CameraX OEM para expor efeitos específicos do dispositivo a desenvolvedores de terceiros por meio da interface de extensões CameraX. CameraX define a interface de extensões CameraX para classes implementadas pelo fornecedor carregadas em tempo de execução. Esta página descreve como implementar a biblioteca de fornecedores OEM e habilitá-la nos dispositivos.

Antes de implementar a biblioteca do fornecedor, certifique-se de entender como funciona a biblioteca de suporte do CameraX Jetpack. Para saber mais sobre CameraX, consulte visão geral CameraX . Para mais informações sobre extensões de fornecedor, consulte extensões vendedor .

Arquitetura

Arquitetura

Figura 1. fornecedor extensões diagrama de arquitetura

Este diagrama descreve a arquitetura das extensões do fornecedor CameraX. Aplicativos de terceiros são construídos com a biblioteca de extensões CameraX (câmera-extensões) e utilizar o extensões câmera API pública (câmera-extensões API). A API de extensões de câmera é definida pelo CameraX e é atualizada quando uma nova versão da biblioteca de extensões de câmera é lançada. O controle de versão da API pública de extensões de câmera e da biblioteca de extensões de câmera são os mesmos.

A interface extensões (extensões de interface) é definida por CameraX e permite que a biblioteca câmera-extensões para falar com a biblioteca fornecedor OEM (câmera-extensões de stub). A biblioteca OEM deve ter uma implementação que corresponda à versão da interface de extensões. Uma única implementação da biblioteca de extensões de câmera pode oferecer suporte a várias versões da interface de extensões.

Implementando a biblioteca de fornecedores OEM

Essas instruções de implementação usam a extensão do fornecedor bokeh (retrato) como exemplo, mas você pode aplicá-las a outras extensões, como as extensões HDR, beauty e night mode. Para fazer isso, copie e cole o código usado para a extensão bokeh e substituir o nome da extensão com que o ramal desejado (por exemplo, substituindo BokehImageCaptureExtenderImpl com HdrImageCaptureExtenderImpl ).

Você não é obrigado a fornecer uma implementação para cada efeito. Um efeito sem uma implementação de fornecedor assume como padrão a implementação do CameraX. Se um efeito não estiver disponível, a implementação padrão não habilitará o efeito e informará ao desenvolvedor terceirizado que o efeito não está disponível.

Verificação de versão

Ao carregar a biblioteca OEM, verifica CameraX que a biblioteca OEM contém uma versão que seja compatível com as extensões de interface versão (referido como extensão de versão deste documento). Para determinar a compatibilidade da versão, o CameraX verifica apenas as versões principais e secundárias (por exemplo, 1.0), mas não verifica a versão do patch porque é usada apenas para correções de bugs, não para alterações de interface. A versão de extensão necessária para APIs específicas é indicada neste documento. APIs sem uma versão de extensão especificada são compatíveis com a versão de extensão 1.0.

Para verificar a versão, CameraX consulta o ExtensionVersionImpl interface. O CameraX usa a versão relatada pela biblioteca OEM para determinar a funcionalidade que pode ser chamada.

Inicialização

O CameraX inicia o processo de inicialização quando determina a versão da interface de extensões implementada pela biblioteca OEM. Os InitializerImpl.init sinais método para a biblioteca OEM que um app quer usar extensões. Nenhum outro chamadas para a biblioteca OEM (além de verificação de versão) são feitas até OnExtensionsInitializedCallback é chamado com um estado de sucesso.

Este método deve ser implementado a partir da versão de extensão 1.1. Para mais detalhes, consulte a fonte de InitializerImpl .

Interface ExtenderStateListener

CameraX fornece ganchos em vários lugares em seu pipeline para permitir que a biblioteca OEM para conjunto relevante SessionParameters e CaptureRequest valores. Para permitir que a biblioteca OEM para definir esses valores nos horários especificados, implementar o ExtenderStateListener interface. Essa interface deve ser implementada como parte de qualquer extensor, seja um extensor de visualização, captura de imagem, bokeh ou HDR.

Captura de imagem

Para apoiar a extensão para captura de imagem , implementar o correspondente ImageCaptureExtender interface (por exemplo, BokehImageCaptureExtender ou HdrImageCaptureExtender ).

ImageCaptureExtender inclui interfaces necessárias para extensões relacionadas com a captura de imagem.

O CaptureProcessor interface deve ser implementado para o pós-processamento a ser feito na camada de aplicativo. A partir de extensões de interface versão 1.1, apenas o YUV_420_888 formato de imagem de entrada deve ser apoiada. O CaptureProcessor interface não é necessária se o processamento é feito no HAL câmera.

O diagrama a seguir ilustra o fluxo do processo de captura de imagem.

Fluxo do processo de captura de imagem

Figura diagrama de fluxo de captura 2. Imagem

Exemplo: BokehImageCaptureExtenderImpl

Para apoiar a extensão bokeh para captura de imagem, implementar o BokehImageCaptureExtenderImpl classe no androidx.camera.extensions.impl pacote.

Visualizar

Para apoiar a extensão para visualização , implementar o correspondente PreviewExtender interface (por exemplo, BokehPreviewExtender ou HdrPreviewExtender ). O PreviewExtender interface inclui as interfaces necessárias para extensões relacionadas visualização em.

Para mais detalhes, consulte a fonte de PreviewExtender .

O processamento de imagem para a extensão de visualização pode ser realizado no HAL da câmera ou na camada do aplicativo. Isto é determinado pelo valor de ProcessorType , que é devolvido por PreviewExtenderImpl .

Se o PROCESSOR_TYPE_REQUEST_UPDATE_ONLY tipo é retornado, o processamento é realizado no HAL através CaptureRequest chaves. Se o PROCESSOR_TYPE_IMAGE_PROCESSOR tipo é retornado, o processamento é realizado na camada de aplicação pelo PreviewImageProcessorImpl interface. Esta interface opera em um Image e TotalCaptureResult par. A partir de extensões de interface versão 1.1, apenas o YUV_420_888 formato de imagem de entrada deve ser apoiada.

O diagrama a seguir ilustra o fluxo do processo para a extensão do fornecedor de visualização.

Visualizar diagrama de fluxo

Diagrama de fluxo Figura 3. Amostra

Exemplo: BokehPreviewExtenderImpl

Para apoiar bokeh para visualização, implementar o BokehPreviewExtenderImpl classe no androidx.camera.extensions.impl pacote.

Implementação de referência

Para uma referência OEM implementação da biblioteca fornecedor, consulte / plataformas / frameworks / suporte / Camera / integração-testes / extensionstestlib / . Observe que essa implementação executa passagens sem realmente implementar os efeitos.

Configurando a biblioteca do fornecedor em um dispositivo

A biblioteca do fornecedor OEM não está integrada em um aplicativo, mas é carregada do dispositivo em tempo de execução pelo CameraX. O <uses-library> tag declara que o androidx.camera.extensions.impl biblioteca, que é definido no AndroidManifest.xml arquivo, é uma dependência de CameraX e deve ser carregado em tempo de execução. Isso permite que aplicativos de terceiros que usam extensões de fornecedor tentem carregar automaticamente a biblioteca de fornecedor OEM. A biblioteca OEM é marcada como opcional para que os aplicativos possam ser executados em dispositivos que não possuem a biblioteca no dispositivo.

O CameraX lida com esse comportamento automaticamente quando um aplicativo tenta usar uma extensão de fornecedor, desde que o fabricante do dispositivo coloque a biblioteca OEM no dispositivo para que ela possa ser descoberta pelo aplicativo.

Para configurar a biblioteca OEM em um dispositivo, faça o seguinte:

  1. Adicionar um arquivo de autorização, o que é exigido pelo <uses-library> tag, usando o seguinte formato: /etc/permissions/ ANY_FILENAME .xml . Por exemplo, /etc/permissions/camera_extensions.xml . Os arquivos neste diretório fornecer um mapeamento da biblioteca nomeado em <uses-library> para o caminho real do arquivo no dispositivo.
  2. Use o exemplo abaixo para adicionar as informações necessárias ao arquivo.

    • name deve ser androidx.camera.extensions.impl já que é a biblioteca que pesquisas CameraX para.
    • file é o caminho absoluto do arquivo que contém a implementação extensões (por exemplo, /system/framework/androidx.camera.extensions.impl.jar ).
    <?xml version="1.0" encoding="utf-8"?>
    <permissions>
        <library name="androidx.camera.extensions.impl"
                 file="OEM_IMPLEMENTED_JAR" />
    </permissions>
    

Em Android 12 ou superior, dispositivos que suportam extensões CameraX deve ter a ro.camerax.extensions.enabled conjunto de propriedades a true , o que permite a consulta se um dispositivo suporta extensões. Para fazer isso, adicione a seguinte linha no arquivo de criação do dispositivo:

PRODUCT_VENDOR_PROPERTIES += \
    ro.camerax.extensions.enabled=true \

Validação

Para testar a sua implementação da biblioteca fornecedor OEM durante a fase de desenvolvimento, use o exemplo aplicativo em androidx-main/camera/integration-tests/extensionstestapp/ , que atravessa várias extensões de fornecedores.

Depois de concluir a implementação, utilize o Vendor Extensions Validation Tool CameraX para executar testes manuais e automatizados para verificar que a biblioteca fornecedor é implementado corretamente.

Perguntas frequentes (FAQ)

Existem restrições nos níveis de API?

sim. Isso depende do conjunto de recursos da API do Android exigido pela implementação da biblioteca do fornecedor OEM. Por exemplo, ExtenderStateListener.onPresetSession() usa as SessionConfiguration.setSessionParameters() chamar para definir um conjunto de base de tags. Essa chamada está disponível apenas na API de nível 28 e superior. Para mais detalhes sobre métodos de interface específicas, consulte a documentação de referência da API .