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, por exemplo, 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 de 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

  • Introdução ao CameraX
  • Exemplo de código

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