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.

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
Exemplo de código