O CameraX fornece uma API Extensions para acessar as extensões que os fabricantes implementaram em vários dispositivos Android. Para conferir uma lista dos modos de extensão com suporte, consulte Extensões de câmera.
Já para uma lista de dispositivos com suporte para extensões, consulte Dispositivos com suporte.
Arquitetura de extensões
A imagem a seguir mostra a arquitetura das extensões da câmera.

Um app da biblioteca CameraX pode usar extensões com a API Extensions dela. Essa API gerencia a consulta de extensões disponíveis, a configuração de uma sessão da câmera de extensão e a comunicação com a biblioteca OEM de extensões. Isso permite que o app use recursos como o modo noturno, HDR, automático, bokeh ou retoque facial.
Ativar uma extensão para captura e visualização de imagens
Antes de usar a API de extensões, extraia uma instância de ExtensionsManager
usando o método ExtensionsManager#getInstanceAsync(Context, CameraProvider). Isso permitirá que você consulte as informações de disponibilidade
da extensão. Em seguida, recupere um CameraSelector
ativado para extensão. O
modo de extensão é aplicado aos casos de uso de captura e visualização de imagens ao
chamar o método bindToLifecycle()
com a extensão CameraSelector
ativada.
Para implementar a extensão para os casos de uso de captura e visualização de imagem, consulte o seguinte exemplo de código:
import androidx.camera.extensions.ExtensionMode
import androidx.camera.extensions.ExtensionsManager
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val lifecycleOwner = this
val cameraProviderFuture = ProcessCameraProvider.getInstance(applicationContext)
cameraProviderFuture.addListener({
// Obtain an instance of a process camera provider
// The camera provider provides access to the set of cameras associated with the device.
// The camera obtained from the provider will be bound to the activity lifecycle.
val cameraProvider = cameraProviderFuture.get()
val extensionsManagerFuture =
ExtensionsManager.getInstanceAsync(applicationContext, cameraProvider)
extensionsManagerFuture.addListener({
// Obtain an instance of the extensions manager
// The extensions manager enables a camera to use extension capabilities available on
// the device.
val extensionsManager = extensionsManagerFuture.get()
// Select the camera
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
// Query if extension is available.
// Not all devices will support extensions or might only support a subset of
// extensions.
if (extensionsManager.isExtensionAvailable(cameraSelector, ExtensionMode.NIGHT)) {
// Unbind all use cases before enabling different extension modes.
try {
cameraProvider.unbindAll()
// Retrieve a night extension enabled camera selector
val nightCameraSelector =
extensionsManager.getExtensionEnabledCameraSelector(
cameraSelector,
ExtensionMode.NIGHT
)
// Bind image capture and preview use cases with the extension enabled camera
// selector.
val imageCapture = ImageCapture.Builder().build()
val preview = Preview.Builder().build()
// Connect the preview to receive the surface the camera outputs the frames
// to. This will allow displaying the camera frames in either a TextureView
// or SurfaceView. The SurfaceProvider can be obtained from the PreviewView.
preview.setSurfaceProvider(surfaceProvider)
// Returns an instance of the camera bound to the lifecycle
// Use this camera object to control various operations with the camera
// Example: flash, zoom, focus metering etc.
val camera = cameraProvider.bindToLifecycle(
lifecycleOwner,
nightCameraSelector,
imageCapture,
preview
)
} catch (e: Exception) {
Log.e(TAG, "Use case binding failed", e)
}
}
}, ContextCompat.getMainExecutor(this))
}, ContextCompat.getMainExecutor(this))
}
import androidx.camera.extensions.ExtensionMode;
import androidx.camera.extensions.ExtensionsManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
final LifecycleOwner lifecycleOwner = this;
final ListenableFuture
Desativar uma extensão
Para desativar as extensões do fornecedor, desvincule todos os casos de uso e vincule novamente os casos de uso de captura
e visualização de imagem com um seletor de câmera normal. Por exemplo, vincule-se novamente à
câmera traseira usando CameraSelector.DEFAULT_BACK_CAMERA
.
Dependências
A API Extensions do CameraX está implementada na biblioteca camera-extensions
.
As extensões dependem dos módulos principais do CameraX (core
, camera2
,
lifecycle
).
dependencies {
def camerax_version = "1.2.0-rc01"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
//the CameraX Extensions library
implementation "androidx.camera:camera-extensions:${camerax_version}"
...
}
dependencies {
val camerax_version = "1.2.0-rc01"
implementation("androidx.camera:camera-core:${camerax_version}")
implementation("androidx.camera:camera-camera2:${camerax_version}")
implementation("androidx.camera:camera-lifecycle:${camerax_version}")
// the CameraX Extensions library
implementation("androidx.camera:camera-extensions:${camerax_version}")
...
}
Remoção da API legada
Com a nova API Extensions lançada na versão 1.0.0-alpha26
, a
API Extensions legada lançada em agosto de 2019 foi descontinuada. Na versão
1.0.0-alpha28
e mais recentes, a API Extensions legada foi removida da
biblioteca. Os aplicativos que usam a nova API Extensions agora precisam encontrar um
CameraSelector
ativado para extensão e usá-lo para vincular os casos de uso.
Os aplicativos que usam a API Extensions legada precisam migrar para a nova versão a fim de garantir a compatibilidade futura com as próximas versões do CameraX.
Outros recursos
Para saber mais sobre o CameraX, consulte os recursos a seguir.
Codelab
Exemplo de código
App de exemplo com extensões do CameraX
Outras referências
Extensões de fornecedor para CameraX
Ferramenta de validação das extensões de fornecedor para CameraX