CameraX bietet eine Extensions API für den Zugriff auf Erweiterungen, die Gerätehersteller auf verschiedenen Android-Geräten implementiert haben. Eine Liste der unterstützten Erweiterungsmodi finden Sie unter Kameraerweiterungen.
Eine Liste der Geräte, die Erweiterungen unterstützen, finden Sie im Artikel Unterstützte Geräte.
Erweiterungsarchitektur
In der folgenden Abbildung sehen Sie die Architektur der Kameraerweiterungen.
Eine CameraX-Anwendung kann Erweiterungen über die CameraX Extensions API verwenden. Über die CameraX Extensions API werden die Abfragen nach verfügbaren Erweiterungen verwaltet, eine Erweiterungskamerasitzung konfiguriert und die Kommunikation mit der OEM-Bibliothek für Kameraerweiterungen verwaltet. Dadurch kann deine Anwendung Funktionen wie Nacht, HDR, Auto, Bokeh oder Gesichtsretusche verwenden.
Erweiterung für Bildaufnahme und Vorschau aktivieren
Rufen Sie vor Verwendung der Extensions API eine ExtensionsManager
-Instanz mit der Methode ExtensionsManager#getInstanceAsync(Context, CameraProvider) ab. Auf diese Weise können Sie die Informationen zur Verfügbarkeit der Erweiterung abfragen. Rufen Sie dann eine Erweiterung mit aktivierter CameraSelector
ab. Der Erweiterungsmodus wird auf die Anwendungsfälle der Bildaufnahme und der Vorschau von Bildern angewendet, wenn die Methode bindToLifecycle() mit aktivierter Erweiterung CameraSelector
aufgerufen wird.
Im folgenden Codebeispiel finden Sie Informationen zum Implementieren der Erweiterung für die Anwendungsfälle der Bilderfassung und der Vorschau:
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)); }
Erweiterung deaktivieren
Zum Deaktivieren von Anbietererweiterungen heben Sie alle Anwendungsfälle auf und verknüpfen die Anwendungsfälle für Bilderfassung und Vorschau mit einer normalen Kameraauswahl neu. Sie können beispielsweise mit CameraSelector.DEFAULT_BACK_CAMERA
eine neue Verbindung zur Rückkamera herstellen.
Abhängigkeiten
Die CameraX Extensions API ist in der camera-extensions
-Bibliothek implementiert.
Die Erweiterungen hängen von den CameraX-Kernmodulen (core
, camera2
, lifecycle
) ab.
Groovig
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}") ... }
Alte API entfernen
Mit der neuen Extensions API, die im 1.0.0-alpha26
veröffentlicht wurde, wurde die alte Extensions API, die im August 2019 veröffentlicht wurde, eingestellt. Ab Version 1.0.0-alpha28
wurde die alte Extensions API aus der Bibliothek entfernt. Anwendungen, die die neue Extensions API verwenden, müssen jetzt ein erweiterungsfähiges CameraSelector
abrufen und damit die Anwendungsfälle verknüpfen.
Anwendungen, die die alte Extensions API verwenden, sollten zur neuen Extensions API migriert werden, um die Kompatibilität mit zukünftigen CameraX-Releases zu gewährleisten.
Weitere Informationen
Weitere Informationen zu CameraX finden Sie in den folgenden zusätzlichen Ressourcen.
Codelab
Codebeispiel
Beispiel-App für CameraX-Erweiterungen
Sonstige Referenzen
Tool zur Validierung von CameraX-Anbietererweiterungen