Hinweis: Diese Seite bezieht sich auf das Camera2-Paket. Sofern Ihre App keine speziellen, Low-Level-Funktionen von Camera2 benötigt, empfehlen wir die Verwendung von CameraX. Sowohl CameraX als auch Camera2 unterstützen Android 5.0 (API-Level 21) und höher.
Camera2 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 unter Unterstützte Geräte.
Architektur von Erweiterungen
Die folgende Abbildung zeigt die Architektur der Kameraerweiterungen.
Eine Camera2-Anwendung kann Erweiterungen über die Camera2 API verwenden. Die Camera2 API bietet Möglichkeiten, verfügbare Erweiterungen abzufragen, eine Kamera-Sitzung mit Erweiterungen zu konfigurieren und mit der OEM-Bibliothek für Kameraerweiterungen zu kommunizieren. So kann Ihre Anwendung Erweiterungen wie Nacht, HDR, Auto, Bokeh oder Gesichtsretusche verwenden.
Kameragerät auf Kompatibilität mit der Camera2 Extensions API testen
Im folgenden Code-Snippet wird geprüft, ob das Gerät die Camera2 Extensions API unterstützt. Erweiterungen werden nicht von allen Geräten unterstützt oder das Gerät unterstützt möglicherweise nur einen Teil der Erweiterungen. Das Snippet gibt eine Liste kompatibler Kamera-IDs zurück, die Kameraerweiterungen unterstützen.
private fun getExtensionCameraIds(cameraManager: CameraManager): List<String> = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { cameraManager.cameraIdList.filter { cameraId -> val characteristics = cameraManager.getCameraCharacteristics(cameraId) val extensionCharacteristics = cameraManager.getCameraExtensionCharacteristics(cameraId) val capabilities = characteristics.get(CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES) extensionCharacteristics.supportedExtensions.isNotEmpty() && capabilities?.contains( CameraCharacteristics.REQUEST_AVAILABLE_CAPABILITIES_BACKWARD_COMPATIBLE ) ?: false } } else emptyList()
CameraExtensionSession mit der Camera2 Extensions API erstellen
Mit der Camera2 Extensions API kannst du auf kompatiblen Geräten auf bestimmte Kameraerweiterungen zugreifen. Das folgende Code-Snippet zeigt ein Beispiel dafür, wie Sie ein CameraExtensionSession für die Verwendung des Nachtaufnahmemodus für eine vorhandene Camera2-Anwendung erstellen.
private val captureCallbacks = object : CameraExtensionSession.ExtensionCaptureCallback() { // Implement Capture Callbacks. } private val extensionSessionStateCallback = object : CameraExtensionSession.StateCallback() { override fun onConfigured(session: CameraExtensionSession) { cameraExtensionSession = session try { val captureRequest = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW).apply { addTarget(previewSurface) }.build() session.setRepeatingRequest( captureRequest, Dispatchers.IO.asExecutor(), captureCallbacks ) } catch (e: CameraAccessException) { Snackbar.make( previewView, "Failed to preview capture request", Snackbar.LENGTH_SHORT ).show() requireActivity().finish() } } override fun onClosed(session: CameraExtensionSession) { super.onClosed(session) cameraDevice.close() } override fun onConfigureFailed(session: CameraExtensionSession) { Snackbar.make( previewView, "Failed to start camera extension preview", Snackbar.LENGTH_SHORT ).show() requireActivity().finish() } } private fun startExtensionSession() { val outputConfig = arrayListOf( OutputConfiguration(stillImageReader.surface), OutputConfiguration(previewSurface) ) val extensionConfiguration = ExtensionSessionConfiguration( CameraExtensionCharacteristics.EXTENSION_NIGHT, outputConfig, Dispatchers.IO.asExecutor(), extensionSessionStateCallback ) cameraDevice.createExtensionSession(extensionConfiguration) }
Zusätzliche Ressourcen
Weitere Informationen findest du unter CameraExtensionCharacteristics und in den öffentlichen Beispielen für die Camera2 Extensions API.