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 findest du unter Kameraerweiterungen.
Eine Liste der Geräte, die Erweiterungen unterstützen, findest du unter Unterstützte Geräte.
Architektur von Erweiterungen
Die folgende Abbildung zeigt die Architektur der Kameraerweiterungen.
Eine CameraX-Anwendung kann Erweiterungen über die CameraX Extensions API verwenden. Die CameraX Extensions API verwaltet die Abfrage verfügbarer Erweiterungen, die Konfiguration einer Kamera-Erweiterungssitzung und die Kommunikation mit der OEM-Bibliothek für Kamera-Erweiterungen. So kann Ihre Anwendung Funktionen wie „Nacht“, „HDR“, „Auto“, „Bokeh“ oder „Gesichtsretusche“ verwenden.
Erweiterung für Bilderfassung und ‑vorschau aktivieren
Bevor Sie die Extensions API verwenden, rufen Sie mit der Methode ExtensionsManager#getInstanceAsync(Context, CameraProvider) eine ExtensionsManager-Instanz ab. So können Sie die Informationen zur Verfügbarkeit der Erweiterung abfragen. Rufen Sie dann eine Erweiterung mit aktiviertem CameraSelector ab. Der Erweiterungsmodus wird auf die Anwendungsfälle „Bilderfassung“ und „Vorschau“ angewendet, wenn die Methode bindToLifecycle() mit aktivierter CameraSelector-Erweiterung aufgerufen wird.
Wenn Sie die Erweiterung für die Anwendungsfälle „Bilderfassung“ und „Vorschau“ implementieren möchten, sehen Sie sich das folgende Codebeispiel an:
// 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)) }
Erweiterung deaktivieren
Wenn du Anbietererweiterungen deaktivieren möchtest, hebe die Bindung aller Anwendungsfälle auf und binde die Anwendungsfälle für die Bilderfassung und die Vorschau mit einer normalen Kameraauswahl neu. Binden Sie beispielsweise mit CameraSelector.DEFAULT_BACK_CAMERA die Rückkamera neu ein.
Abhängigkeiten
Die CameraX Extensions API ist in der Bibliothek camera-extensions implementiert.
Die Erweiterungen hängen von den CameraX-Kernmodulen (core, camera2, lifecycle) ab.
Groovy
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}") ... }
Entfernung der Legacy API
Mit der neuen Extensions API, die in 1.0.0-alpha26 veröffentlicht wurde, wird die im August 2019 veröffentlichte Legacy-Extensions API jetzt eingestellt. Ab Version 1.0.0-alpha28 wurde die Legacy-Extensions API aus der Bibliothek entfernt. Anwendungen, die die neue Extensions API verwenden, müssen jetzt eine erweiterungsfähige CameraSelector abrufen und damit die Anwendungsfälle binden.
Anwendungen, die die alte Extensions API verwenden, sollten zur neuen Extensions API migrieren, um die Kompatibilität mit zukünftigen CameraX-Releases zu gewährleisten.
Zusätzliche Ressourcen
Weitere Informationen zu CameraX findest du in den folgenden Ressourcen.
Codelab
Codebeispiel
Beispiel-App für CameraX-Erweiterungen
Sonstige Referenzen
CameraX Vendor Extensions Validation Tool