CameraX fornisce un'API Extensions per accedere alle estensioni che i produttori di dispositivi hanno implementato su vari dispositivi Android. Per un elenco delle modalità di estensione supportate, vedi Estensioni Fotocamera.
Per un elenco dei dispositivi che supportano le estensioni, vedi Dispositivi supportati.
Architettura delle estensioni
L'immagine seguente mostra l'architettura delle estensioni della fotocamera.
Un'applicazione CameraX può utilizzare le estensioni tramite l'API CameraX Extensions. L'API CameraX Extensions gestisce le query relative alle estensioni disponibili, configurando una sessione della videocamera delle estensioni e comunicando con la libreria OEM di Camera Extensions. In questo modo l'applicazione può utilizzare funzionalità quali Notte, HDR, Auto, Bokeh o Ritocco viso.
Attiva un'estensione per l'acquisizione e l'anteprima delle immagini
Prima di utilizzare l'API delle estensioni, recupera un'istanza ExtensionsManager
con il metodo ExtensionsManager#getInstanceAsync(Context, CameraProvider). In questo modo potrai eseguire query sulle informazioni
sulla disponibilità dell'estensione. Quindi, recupera un'estensione abilitata CameraSelector
. La modalità di estensione verrà applicata ai casi d'uso di acquisizione e anteprima delle immagini quando chiami il metodo bindToLifecycle() con l'estensione CameraSelector
abilitata.
Per implementare l'estensione per i casi d'uso di acquisizione delle immagini e anteprima, fai riferimento al seguente esempio di codice:
Kotlin
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)) }
Java
import androidx.camera.extensions.ExtensionMode; import androidx.camera.extensions.ExtensionsManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); final LifecycleOwner lifecycleOwner = this; final ListenableFuturecameraProviderFuture = ProcessCameraProvider.getInstance(getApplicationContext()); cameraProviderFuture.addListener(() -> { try { // 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. final ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); final ListenableFuture extensionsManagerFuture = ExtensionsManager.getInstanceAsync(getApplicationContext(), cameraProvider); extensionsManagerFuture.addListener(() -> { // Obtain an instance of the extensions manager // The extensions manager enables a camera to use extension capabilities available // on the device. try { final ExtensionsManager extensionsManager = extensionsManagerFuture.get(); // Select the camera final CameraSelector 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. cameraProvider.unbindAll(); // Retrieve extension enabled camera selector final CameraSelector nightCameraSelector = extensionsManager .getExtensionEnabledCameraSelector(cameraSelector, ExtensionMode.NIGHT); // Bind image capture and preview use cases with the extension enabled camera // selector. final ImageCapture imageCapture = new ImageCapture.Builder().build(); final Preview preview = new 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); cameraProvider.bindToLifecycle( lifecycleOwner, nightCameraSelector, imageCapture, preview ); } } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); } }, ContextCompat.getMainExecutor(this)); } catch (ExecutionException | InterruptedException e) { throw new RuntimeException(e); } }, ContextCompat.getMainExecutor(this)); }
Disattivare l'estensione
Per disabilitare le estensioni del fornitore, svincola tutti i casi d'uso e associa nuovamente l'acquisizione delle immagini
e l'anteprima dei casi d'uso con un normale selettore fotocamera. Ad esempio, associa nuovamente la
fotocamera posteriore utilizzando CameraSelector.DEFAULT_BACK_CAMERA
.
Dipendenze
L'API CameraX Extensions è implementata nella libreria camera-extensions
.
Le estensioni dipendono dai moduli principali di CameraX (core
, camera2
,
lifecycle
).
Trendy
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}" ... }
Kotlin
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}") ... }
Rimozione dell'API legacy
Con la nuova API Extensions rilasciata in 1.0.0-alpha26
, l'API
legacy Extensions rilasciata ad agosto 2019 è ora deprecata. A partire dalla versione 1.0.0-alpha28
, l'API Extensions legacy è stata rimossa dalla libreria. Le applicazioni che utilizzano la nuova API Extensions devono ora acquisire un elemento CameraSelector
abilitato per le estensioni e utilizzarlo per vincolare i casi d'uso.
Le applicazioni che utilizzano la precedente API Extensions devono migrare alla nuova API Extensions per garantire la compatibilità futura con le prossime release di CameraX.
Risorse aggiuntive
Per saperne di più su CameraX, consulta le seguenti risorse aggiuntive.
Codelab
Esempio di codice
Esempio di app per le estensioni CameraX
Altri riferimenti
Estensioni dei fornitori di CameraX
Strumento di convalida delle estensioni del fornitore CameraX