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

Extensões do fornecedor

O CameraX fornece uma API para acessar efeitos bokeh, HDR e outros que foram implementados por fabricantes em smartphones específicos. Para que um dispositivo seja compatível com as extensões do fornecedor, todas as seguintes condições precisam ser verdadeiras:

  • O efeito tem compatibilidade com bibliotecas do OEM do dispositivo.
  • A biblioteca do OEM está instalada no dispositivo atual.
  • A biblioteca do OEM informa que o dispositivo é compatível com a extensão.
  • O dispositivo tem uma versão do sistema operacional exigida pela biblioteca.

Você pode ativar uma extensão de preferência: se ela for compatível e estiver fisicamente presente no dispositivo, será ativada. Caso contrário, ela será removida de forma eficiente.

Os fornecedores não precisam fornecer uma implementação para cada efeito e recurso. Qualquer recurso sem uma implementação fornecida pelo fornecedor é padronizado para a implementação do CameraX. A implementação padrão informa que o recurso não está disponível e pula a ativação.

Arquitetura de extensões

A imagem a seguir mostra a arquitetura das extensões com CameraX.

Figura 1. Arquitetura CameraX para extensões

As extensões são separadas do núcleo Camera2 do CameraX. No diagrama, as setas vermelhas indicam o fluxo de dados principal quando os usuários acionam um recurso com base em uma extensão, como a captura de imagens HDR.

Ativar um efeito para captura de imagem

Para aplicar extensões de fornecedor aos casos de uso do CameraX, crie um objeto Extender, que permitirá a configuração do Builder com as configurações desse efeito ou função. Consulte a extensão para saber a disponibilidade. Se uma extensão não estiver disponível, a chamada enableExtension() não terá efeito.

Para implementar a extensão para o caso de uso da captura de imagem, implemente o extensor de captura de imagem correspondente, conforme exibido na seguinte amostra de código:

Kotlin

    import androidx.camera.extensions.BokehExtender

    fun onCreate() {
        // Create a Builder same as in normal workflow.
        val builder = ImageCapture.Builder()

        // Create a camera provider
        val cameraProvider : ProcessCameraProvider = ... // Get the provider instance

        // Create an Extender object which can be used to apply extension
        // configurations.
        val bokehImageCapture = BokehImageCaptureExtender.create(builder)

        // Select the camera
        val cameraSelector = CameraSelector.Builder()
                                           .requireLensFacing(CameraX.LensFacing.BACK)
                                           .build()

        // Query if extension is available (optional).
        if (bokehImageCapture.isExtensionAvailable()) {
            // Enable the extension if available.
            bokehImageCapture.enableExtension()
        }

        // Finish constructing configuration with the same flow as when not using
        // extensions.
        val useCase = ImageCapture.Builder().build()
        cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase)
    }
    

Java

    import androidx.camera.extensions.BokehExtender;

    void onCreate() {
        // Create a Builder same as in normal workflow.
        ImageCapture.Builder builder = new ImageCapture.Builder();

        // Create a camera provider
        ProcessCameraProvider cameraProvider = ...; // Get the provider instance

        // Create an Extender object which can be used to apply extension
        // configurations.
        BokehImageCaptureExtender bokehImageCapture = new
                BokehImageCaptureExtender(builder);

        // Select the camera
        CameraSelector cameraSelector = new CameraSelector.Builder().
                                                          .requireLensFacing(CameraX.LensFacing.BACK)
                                                          .build();

        // Query if extension is available (optional).
        if (bokehImageCapture.isExtensionAvailable()) {
            // Enable the extension if available.
            bokehImageCapture.enableExtension();
        }

        // Finish constructing configuration with the same flow as when not using
        // extensions.
        ImageCapture useCase = new ImageCapture.Builder.build();
        cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, useCase);
    }

    

Desativar o efeito

Para desabilitar as extensões do fornecedor, crie uma nova instância do caso de uso do ImageCapture ou de visualização.

Outros recursos

Para saber mais sobre o CameraX, consulte os seguintes recursos.

Codelab

  • Primeiros passos com o CameraX (link em inglês)
  • Amostra de código

  • App de amostra oficial do CameraX (link em inglês)