Mehr als nur einzelne Funktionen: Garantierte Funktionskombinationen mit CameraX 1.5
Lesezeit: 6 Minuten
Moderne Kamera-Apps zeichnen sich durch leistungsstarke, sich überschneidende Funktionen aus. Nutzer erwarten, dass sie Videos mit beeindruckendem HDR aufnehmen, flüssige Bewegungen mit 60 fps festhalten und mit der Stabilisierung der Vorschau ruckelfreie Aufnahmen machen können – oft alles gleichzeitig.
Als Entwickler wissen wir, dass die Realität komplizierter ist. Wie können Sie sicherstellen, dass ein bestimmtes Gerät eine bestimmte Kombination tatsächlich unterstützt? Bisher war das Aktivieren mehrerer Funktionen oft ein Glücksspiel. Sie könnten die Unterstützung für einzelne Funktionen prüfen, aber die Kombination dieser Funktionen könnte zu undefiniertem Verhalten oder, schlimmer noch, zu einer fehlgeschlagenen Kamerasitzung führen. Diese Unsicherheit zwingt Entwickler dazu, konservativ zu sein, was Nutzer auf leistungsfähigen Geräten daran hindert, die bestmögliche Erfahrung zu machen.
Beispielsweise unterstützen nur sehr wenige Premium-Geräte gleichzeitig HDR und 60 fps. Daher wird in den meisten Apps vermieden, beide gleichzeitig zu aktivieren, um eine schlechte Nutzererfahrung auf den meisten Smartphones zu vermeiden.
Um dieses Problem zu beheben, führen wir die Feature Group in CameraX ein – eine neue API, die dieses Rätselraten überflüssig macht. Du kannst jetzt vor der Konfiguration der Kamera abfragen, ob eine bestimmte Kombination von Funktionen unterstützt wird, oder CameraX einfach deine Prioritäten mitteilen und die am besten unterstützte Kombination für dich aktivieren lassen.
Für CameraX-Einsteiger
Bevor wir uns die neue Feature Group API ansehen, fassen wir kurz zusammen, was CameraX ist. CameraX ist eine Jetpack-Supportbibliothek, die App-Entwicklern die Entwicklung von Kamera-Apps vereinfacht. Sie bietet eine einheitliche und nutzerfreundliche API-Oberfläche, die auf den meisten Android-Geräten funktioniert und abwärtskompatibel bis Android 6.0 (API-Level 23) ist. Wenn Sie CameraX noch nicht kennen, empfehlen wir Ihnen, die offizielle Dokumentation zu lesen und das Codelab auszuprobieren, um loszulegen.
Was Sie mit der Feature Group API erstellen können
Ihr müsst nicht mehr raten, welche Kombinationen von Funktionen funktionieren, sondern könnt zuverlässig die bestmögliche Kameraerfahrung bieten, z. B. gleichzeitiges HDR und 60 fps-Video auf leistungsfähiger Hardware (z. B. einem Pixel 10 Pro), und gleichzeitig Fehler auf Geräten vermeiden, die diese Kombination nicht unterstützen.
Mit der Feature Group API können Sie:
- Intelligentere, dynamische Benutzeroberflächen erstellen:Einstellungen in der Benutzeroberfläche können basierend auf der Hardwareunterstützung in Echtzeit intelligent aktiviert oder deaktiviert werden. Wenn ein Nutzer beispielsweise HDR aktiviert, kannst du die Option „60 fps“ sofort ausgrauen und deaktivieren, wenn die Kombination auf dem Gerät nicht unterstützt wird.
- Zuverlässigen Modus „Hohe Qualität“ bereitstellen : Konfiguriere die Kamera mit einer priorisierten Liste der gewünschten Funktionen. CameraX findet und aktiviert automatisch die am besten unterstützte Kombination für jedes Gerät und sorgt so für ein hervorragendes Ergebnis ohne komplexe, gerätespezifische Logik.
- Fehler bei Kamerasitzungen verhindern:Wenn du die Unterstützung im Voraus prüfst, verhinderst du, dass die Kamera versucht, eine nicht unterstützte Kombination zu konfigurieren. So vermeidest du eine häufige Ursache für Abstürze und bietest eine reibungslose Nutzererfahrung.
Funktionsweise: Die Kernkomponenten
Die neue API konzentriert sich auf wichtige Ergänzungen zu SessionConfig und CameraInfo.
- GroupableFeature: Diese API führt eine Reihe vordefinierter gruppierbarer Funktionen ein, z. B. HDR_HLG10, FPS_60, PREVIEW_STABILIZATION und IMAGE_ULTRA_HDR. Aufgrund von Rechenbeschränkungen kann nur eine bestimmte Gruppe von Merkmalen mit der hohen Zuverlässigkeit gruppiert werden, die diese API bietet. Wir arbeiten aktiv daran, diese Liste zu erweitern, und werden in zukünftigen Versionen Unterstützung für weitere Funktionen einführen.
- Neue SessionConfig-Parameter: Diese Klasse, die zum Starten einer Kamerasitzung verwendet wird, akzeptiert jetzt zwei neue Parameter:
requiredFeatureGroup: Verwenden Sie diese Option für Funktionen, die unterstützt werden müssen, damit die Konfiguration erfolgreich ist. Sie eignet sich ideal für Funktionen, die ein Nutzer explizit aktiviert, z. B. durch Aktivieren eines HDR-Schalters. Damit die Funktion deterministisch und konsistent ist, wird beim Aufruf vonbindToLifecycleeinIllegalArgumentExceptionausgegeben, wenn die angeforderte Kombination nicht unterstützt wird, anstatt eine Feature Request stillschweigend zu ignorieren. DieCameraInfo#isFeatureGroupSupportedAPI (Details unten) sollte verwendet werden, um dieses Ergebnis im Voraus abzufragen.preferredFeatureGroup: Verwenden Sie diese Option für Funktionen, die wünschenswert, aber optional sind, z. B. wenn Sie einen Standardmodus „Hohe Qualität“ implementieren möchten. Sie stellen eine Liste der gewünschten Funktionen bereit, die nach Ihren Prioritäten geordnet ist. CameraX aktiviert dann automatisch die Kombination mit der höchsten Priorität, die vom Gerät unterstützt wird.
- CameraInfo#isFeatureGroupSupported(): Dies ist die wichtigste Abfragemethode, um explizit zu prüfen, ob eine Funktionsgruppe unterstützt wird. Sie eignet sich gut, um Nutzern in der App-Benutzeroberfläche nur unterstützte Funktionsoptionen anzubieten. Du übergibst einen
SessionConfigund erhältst einen booleschen Wert, der angibt, ob die Kombination unterstützt wird. Wenn Sie einSessionConfigmit erforderlichen Funktionen binden möchten, sollten Sie zuerst diese API verwenden, um sicherzustellen, dass es unterstützt wird.
Implementierung in der Praxis
Sehen wir uns an, wie du diese Komponenten verwenden kannst, um die Kamera zu verbessern.
Szenario 1: Modus „Hohe Qualität“ mit bestmöglichem Ergebnis
Wenn Sie die bestmöglichen Funktionen standardmäßig aktivieren möchten, können Sie eine priorisierte Liste für preferredFeatureGroup bereitstellen. In diesem Beispiel weisen wir CameraX an, HDR, dann 60 fps und schließlich die Stabilisierung der Vorschau zu priorisieren. CameraX übernimmt die komplexe Aufgabe, alle möglichen Kombinationen zu prüfen und die beste vom Gerät unterstützte Kombination auszuwählen.
Wenn ein Gerät beispielsweise HDR und 60 fps zusammen, aber nicht mit der Vorschau-Stabilisierung verarbeiten kann, aktiviert CameraX die ersten beiden und verwirft die dritte. So erhalten Sie die bestmögliche Leistung, ohne komplexe, gerätespezifische Prüfungen schreiben zu müssen.
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
SessionConfig(
useCases = listOf(preview, videoCapture),
// The order of features in this list determines their priority.
// CameraX will enable the best-supported combination based on these
// priorities: HDR_HLG10 > FPS_60 > Preview Stabilization.
preferredFeatureGroup =
listOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION),
).apply {
// (Optional) Get a callback with the enabled features
// to update your UI.
setFeatureSelectionListener { selectedFeatures ->
updateUiIndicators(selectedFeatures)
}
}
)In diesem Code-Snippet versucht CameraX, Funktionskombinationen in der folgenden Prioritätsreihenfolge zu aktivieren. Dabei wird die erste Kombination ausgewählt, die vom Gerät vollständig unterstützt wird:
- HDR + 60 fps + Stabilisierung der Vorschau
- HDR + 60 fps
- HDR+ & Vorschau-Stabilisierung
- HDR
- 60 fps + Stabilisierung der Vorschau
- 60 fps
- Vorschau der Stabilisierung
- Keine der oben genannten Funktionen
Szenario 2: Reaktive UI erstellen
Wenn Sie eine Benutzeroberfläche erstellen möchten, die auf die Auswahl des Nutzers reagiert und verhindert, dass Nutzer eine nicht unterstützte Funktionskombination auswählen, können Sie die Unterstützung direkt abfragen. Mit der folgenden Funktion wird geprüft, welche Funktionen mit der aktuellen Auswahl des Nutzers nicht kompatibel sind. So können Sie die entsprechenden UI-Elemente deaktivieren.
/**
* Returns a list of features that are NOT supported in combination
* with the currently selected features.
*/
fun getUnsupportedFeatures(
currentFeatures: Set<GroupableFeature>
): Set<GroupableFeature> {
val unsupportedFeatures = mutableSetOf<GroupableFeature>()
val appFeatureOptions = setOf(HDR_HLG10, FPS_60, PREVIEW_STABILIZATION)
// Iterate over every available feature option in your app.
appFeatureOptions.forEach { featureOption ->
// Skip features the user has already selected.
if (currentFeatures.contains(featureOption)) return@forEach
// Check if adding this new feature is supported.
val isSupported = cameraInfo.isFeatureGroupSupported(
SessionConfig(
useCases = useCases,
// Check the new feature on top of existing ones.
requiredFeatureGroup = currentFeatures + featureOption
)
)
if (!isSupported) {
unsupportedFeatures.add(featureOption)
}
}
return unsupportedFeatures
}Diese Logik können Sie dann in Ihr ViewModel oder Ihren UI-Controller einbinden, um auf Nutzereingaben zu reagieren und die Kamera mit einer garantiert funktionierenden Konfiguration neu zu binden.
// Invoked when user turns some feature on/off.
fun onFeatureChange(currentFeatures: Set<GroupableFeature>) {
// Identify features that are unsupported with the current selection.
val unsupportedFeatures = getUnsupportedFeatures(currentFeatures)
// Update app UI so that users can't enable them.
updateDisabledFeatures(unsupportedFeatures)
// Since the UI now only allows selecting supported feature combinations,
// `currentFeatures` is always valid. This allows setting
// `requiredFeatureGroup` directly, without needing to re-check for
// support or set a feature selection listener.
cameraProvider.bindToLifecycle(
lifecycleOwner,
cameraSelector,
SessionConfig(
useCases = listOf(preview, videoCapture),
requiredFeatureGroup = currentFeatures,
)
)
}Wenn Sie sich diese Konzepte in einer funktionierenden Anwendung ansehen möchten, können Sie unsere interne Test-App ausprobieren. Sie bietet eine vollständige Implementierung der oben beschriebenen Szenarien „Best Effort“ und „Reaktive UI“.
Hinweis: Dies ist eine Testanwendung und kein offiziell unterstütztes Beispiel. Sie ist zwar eine gute Referenz für die Feature Group API, wurde aber nicht für den Produktionseinsatz optimiert.
Noch heute loslegen
Die Feature Group API beseitigt die Unklarheiten bei der Arbeit mit erweiterten Kamerafunktionen. Durch die Bereitstellung einer deterministischen Methode zum Abfragen der Funktionsunterstützung können Sie leistungsstärkere und zuverlässigere Kamera-Apps entwickeln.
Die API ist in CameraX 1.5 als experimentelle Funktion verfügbar und soll in Version 1.6 vollständig stabil werden. Weitere Unterstützung und Verbesserungen sind geplant.
Weitere Informationen finden Sie in der offiziellen Dokumentation. Wir sind schon gespannt, was Sie mit dem Tool erstellen, und freuen uns auf Ihr Feedback. Über die folgenden Kanäle kannst du uns deine Meinung mitteilen und Probleme melden:
-
ProduktneuigkeitenApps, die auf die kommende Android-Version ausgerichtet sind, können mit der Berechtigung WRITE_CONTACTS nicht mehr direkt in Kontakte schreiben.
Roxanna Aliabadi Walker • Lesezeit: 6 Minuten -
ProduktneuigkeitenDie Entwicklung von KI-Agenten schreitet rasant voran und die Android-Entwicklung erreicht einen spannenden neuen Meilenstein: von der unterstützenden Codevervollständigung hin zu KI-Agenten, die unter Ihrer Anleitung End-to-End-Aufgaben ausführen. Sie haben die volle Auswahl und Flexibilität bei den Modellen und Agents, die Sie verwenden.
Jason Buchel • Lesezeit: 3 Minuten -
ProduktneuigkeitenHeute haben wir euch gezeigt, wie wir unsere Vision „Mehr als nur ein Store“ weiterentwickeln. Vom Tab „Mein Play“, der mittlerweile die persönliche Anlaufstelle für über 250 Millionen monatlich aktive Nutzer ist, bis hin zu unserer einheitlichen Gaming-Plattform, die über 700 Millionen Spielerprofile verbindet – Google Play ist immer da, wo die Nutzer sind.
Paul Feng • Lesezeit: 3 Minuten
Lassen Sie sich Woche für Woche die neuesten Informationen zur Android-Entwicklung zusenden.