Unterstützung von Kameras auf mehreren Formfaktoren

Android-Apps werden nicht nur auf Smartphones im Hochformat ausgeführt. Mit der Einführung von Desktop-Freiform-Fenstern, verbundenen Displays und faltbaren Geräten muss sich Ihre Kamera-App an dynamische Fenstergrößen, unterschiedliche Seitenverhältnisse und externe Hardware anpassen.

Abbildung 1. Beispiel für Kamera-Apps auf verschiedenen Displays

Warum die Logik von Smartphones nicht funktioniert

Kamera-Apps gehen oft von Annahmen aus, die in Umgebungen mit mehreren Formfaktoren zu kritischen Fehlern führen.

Natürliche Ausrichtung

  • Annahme:Die natürliche Ausrichtung des Geräts ROTATION_0 ist immer das Hochformat.
  • Realität:Auf Tablets, dem inneren Display einiger Foldables und Desktopmonitoren ist ROTATION_0 oft im Querformat.
  • Ergebnis:Die Vorschau wird fälschlicherweise um 90 Grad gedreht.
Abbildung 2. Kamerasucher vor und nach der korrekten Drehung.

Sensorausrichtung

  • Annahme:Die lange Kante des Kamerasensors ist an der langen Kante des Displays ausgerichtet.
  • Realität:Ein anpassbares Fenster kann quadratisch oder im Querformat sein, während der Sensor fest bleibt (normalerweise 4:3).
  • Ergebnis:Gestreckte oder anderweitig verzerrte Bilder
Abbildung 3. Kamerasucher vor und nach dem Anwenden des richtigen Skalierungsfaktors.

Bildschirmdichte und ‑größe

  • Annahme:Die Dichte und Größe des Bildschirms ändern sich zur Laufzeit nicht.
  • Fakt:In Desktopumgebungen können Nutzer Fenster frei in der Größe anpassen.
  • Ergebnis:Wenn die Kamerasitzung bei jedem Ziehvorgang neu gestartet wird, wird die Nutzerfreundlichkeit beeinträchtigt und es kann zu Abstürzen kommen.

Lösung 1: System-Intents verwenden

Wenn Ihre App ein Foto oder Video aufnehmen muss, aber keine spezielle benutzerdefinierte Kameraoberfläche benötigt, ist es am besten, die vorinstallierte Systemkamera des Geräts zu starten (siehe Kamera-Intents).

Wenn Sie einen System-Intent verwenden, wird die gesamte Aufnahme an die Kamera-App delegiert, die vom Erstausrüster (OEM) des Geräts entwickelt wurde. Dadurch wird die Komplexität der Unterstützung von Formfaktoren effektiv ausgelagert, einschließlich:

  • Integrierte Unterstützung für Größenanpassung und Drehung: Die Standardkamera-App auf einem faltbaren Gerät oder Tablet wurde vom Hersteller speziell für die Geometrie des jeweiligen Geräts entwickelt. Die App ist so konzipiert, dass sie sich korrekt verhält, wenn das Gerät aufgeklappt, gedreht oder in den Mehrfenstermodus versetzt wird.

  • Zugriff auf erweiterte Hardwarefunktionen: OEM-Kamera-Apps haben exklusiven Zugriff auf hardwareoptimierte Algorithmen (Nachtsichtmodus, HDR, bestimmte Objektivwechsel), die manuell nur schwer oder gar nicht nachgebildet werden können.

Lösung 2: Jetpack CameraX verwenden

CameraX ist eine Jetpack-Bibliothek, die die Entwicklung von Kamera-Apps vereinfachen soll. CameraX ist lebenszyklus- und oberflächenorientiert. Im Gegensatz zu Camera2, bei dem die Sensorausrichtung und die Oberflächengrößen manuell neu berechnet werden müssen, wenn ein Gerät gefaltet, gedreht oder in der Größe geändert wird, übernimmt CameraX die Neukonfiguration von Kamerasitzungen automatisch, wenn die Größe von mehreren Fenstern geändert wird oder eine App auf ein verbundenes Display verschoben wird. So wird der Vorschaustream ohne Ruckeln oder Strecken angepasst.

Komponenten wie PreviewView verwalten das Seitenverhältnis und die Skalierungstypen in verschiedenen Status, z. B. wenn ein faltbares Gerät vom Außendisplay zum Innendisplay wechselt. So können Sie eine Vielzahl von Hardware mit einer einzigen, konsistenten Implementierung unterstützen, anstatt mit einer komplizierten Sammlung gerätespezifischer Grenzfälle.

Schreiben

Verwenden Sie mit Jetpack Compose die spezielle Bibliothek androidx.camera:camera-compose. Die Bibliothek bietet die zusammensetzbare Funktion CameraXViewfinder, die speziell für die komplexe Geometrie von Größenänderungen, Drehungen und Seitenverhältnissen innerhalb des Compose-Lebenszyklus entwickelt wurde.

Die CameraXViewfinder-Komponente beseitigt die häufigsten Fehlerquellen in Kamera-Apps:

  • Automatische Koordinatentransformation: Eine der schwierigsten Aufgaben beim Entwickeln einer Kamera-App ist die Zuordnung eines Taps des Nutzers (x, y-Koordinaten auf dem Bildschirm) zum Koordinatensystem des Kamerasensors (0–1, 0–1 gedreht) für Fokus und Belichtungsmessung. CameraXViewfinder bietet ein CoordinateTransformer, das die Berechnungen automatisch ausführt, auch wenn die Größe des Fensters geändert oder das Gerät zusammengeklappt wird.
  • Korrektes Layoutverhalten: Im Gegensatz zu SurfaceView oder TextureView funktioniert CameraXViewfinder korrekt mit der Z-Reihenfolge von Compose. Sie können UI-Elemente (Fokusringe, Steuerelemente) überlagern oder Modifikatoren (abgerundete Ecken, Animationen) anwenden, ohne Rendering-Artefakte zu erzeugen.
  • Größenanpassung und Seitenverhältnis: CameraXViewfinder verarbeitet intern die Logik für Center Crop im Vergleich zu Fit Center. So wird sichergestellt, dass die Vorschau nicht gestreckt wird, wenn die Größe des App-Fensters an nicht standardmäßige Seitenverhältnisse angepasst wird (z. B. im Split-Screen- oder Desktop-Fenstermodus).

Aufrufe

Verwenden Sie in ansichtsbasierten Apps PreviewView oder ViewFinderView. Wenn Sie SurfaceView oder TextureView direkt verwenden, müssen Sie das Seitenverhältnis selbst berechnen und die richtige Transformationsmatrix anwenden.

Lösung 3: Ausrichtung und Größenanpassung dynamisch verarbeiten

Wenn Sie Plattform-APIs direkt verwenden, sollten Sie die Geräteausrichtung, Neustarts von Aktivitäten und das Seitenverhältnis berücksichtigen.

Gerätedrehung nicht mehr verwenden

Verlassen Sie sich nicht nur auf Display#getRotation() oder die Ausrichtung des physischen Sensors, um das UI-Layout zu bestimmen.

  • Fenstermesswerte verwenden: Bestimmen Sie das Layout (UI im Quer- oder Hochformat), indem Sie die Breite und Höhe des App-Fensters mit WindowManager#getCurrentWindowMetrics() vergleichen.
  • Natürliche Ausrichtung ignorieren: Ihre App wird möglicherweise in einem hochformatigen Fenster auf einem Monitor im Querformat angezeigt. Die Ausrichtung des Geräts ist für die Grenzen der Benutzeroberfläche irrelevant.

Neustarts von Aktivitäten vermeiden

Standardmäßig wird die Aktivität Ihrer App bei Konfigurationsänderungen (z. B. bei der Anpassung der Fenstergröße) beendet. Bei Kamera-Apps kann dies zu einem Flimmern des Displays oder zu einer unterbrochenen Verbindung bei Videoanrufen führen.

Seitenverhältnis und Zuschneiden

Ein häufiges Problem auf faltbaren Geräten und Desktop-Fenstern ist das Strecken der Vorschau, bei dem ein 4:3-Kamerafeed in ein 16:9- oder 1:1-Fenster gezwungen wird.

  • Nicht dehnen: Der Kamerabuffer wird nie so angepasst, dass er genau den Ansichtsgrenzen entspricht, wenn sich die Seitenverhältnisse von Vorschau und Fenster unterscheiden.
  • Zentriert zuschneiden (empfohlen): Die Vorschau wird so skaliert, dass sie die kürzeste Dimension des Fensters ausfüllt. Der Überschuss wird abgeschnitten. So wird sichergestellt, dass das Motiv unverzerrt bleibt und den Rahmen ausfüllt.
  • Mittig einpassen (alternativ): Wenn es wichtig ist, das gesamte Sichtfeld anzuzeigen (z. B. beim Scannen eines Dokuments), wird die Vorschau im Fenster mit Letterboxing versehen.
  • Mittig einpassen (alternativ): Wenn es wichtig ist, das gesamte Sichtfeld anzuzeigen (z. B. beim Scannen eines Dokuments), wird die Vorschau im Fenster mit Letterboxing versehen.

Bonus: Unterstützung für faltbare Geräte

Faltbare Geräte sind nicht nur Smartphones, die sich biegen lassen. Sie bieten einzigartige Hardwarezustände, die die Art und Weise, wie Nutzer Fotos und Videos aufnehmen, grundlegend verbessern können. Anstatt das Foldable als Problem zu betrachten, das gelöst werden muss, sollten Sie es nutzen, um Funktionen zu entwickeln, die auf nicht faltbaren Geräten nicht möglich sind.

Modus „Auf dem Tisch“ (Aufnahmen per Sprachbefehl)

Im Modus „Auf dem Tisch“ können Nutzer das Gerät halb zusammenfalten und auf einer Oberfläche abstellen, um längere Videoanrufe zu führen, Zeitrafferaufnahmen zu machen und Nachtaufnahmen mit langer Belichtungszeit zu erstellen.

Abbildung 5: Eine Kommunikations-App im „Auf dem Tisch“-Modus: Der Kamerasucher befindet sich oben am Scharnier und die Steuerelemente unten.

Rückdisplay-Modus (hochwertige Selfies)

  • Bei Faltgeräten haben Rückkameras in der Regel eine höhere Qualität als die nach vorn gerichteten Kameras. Im Rückdisplay-Modus kann der Nutzer das Gerät aufklappen und umdrehen. Das kleine Frontdisplay dient dann als Live-Sucher für die Hauptrückkamera.
  • Im Rückdisplay-Modus können Sie Selfies mit 50 MP oder mehr, Ultraweitwinkel-Gruppenaufnahmen und hochwertiges Vlogging ohne zusätzliche Ausrüstung machen.

Dual Screen-Modus (Vorschau für das Motiv)

  • Im Dual-Screen-Modus können Sie die Kameravorschau gleichzeitig auf dem inneren und äußeren Display anzeigen lassen. Das ist ideal für das Fotografieren von Personen: Die Fotomotive können sich auf dem äußeren Display sehen und ihre Pose anpassen, während du auf dem inneren Display den Bildausschnitt festlegst.
  • Im Gegensatz zum Modus für das Rückdisplay, bei dem die gesamte App auf das Coverdisplay verschoben wird, wird im Dual-Screen-Modus ein sekundäres Präsentationsfenster auf dem Coverdisplay erstellt.
Abbildung 5. Eine Kamera-App im Dual Screen-Modus.