Gerätehersteller können Erweiterungen wie Bokeh, Nachtmodus und HDR anbieten. über die Oberfläche für Kameraerweiterungen, die von der OEM-Anbieterbibliothek. Entwickler können die Camera2 Extensions API und der CameraX Extensions API um auf die Erweiterungen zuzugreifen, die in der OEM-Anbieterbibliothek implementiert sind.
Eine Liste der unterstützten Erweiterungen, die für Kamera2 identisch sind und CameraX, siehe CameraX Extensions API an. Wenn Sie eine Erweiterung hinzufügen möchten, melden Sie einen Fehler mit dem Problemverfolgung
Auf dieser Seite wird beschrieben, wie Sie die OEM-Anbieterbibliothek für Geräte.
Architektur
Im folgenden Diagramm wird die Architektur der Kameraerweiterungen beschrieben.
oder extensions-interface
:
Abbildung 1: Architekturdiagramm für Kameraerweiterungen
Wie in der Abbildung dargestellt, müssen Sie zur Unterstützung von Kameraerweiterungen
Implementieren Sie die extensions-interface
aus der OEM-Anbieterbibliothek. Ihr
Die OEM-Anbieterbibliothek ermöglicht zwei APIs:
CameraX Extensions API und
Camera2 Extensions API,
die von den CameraX- bzw. Camera2-Apps verwendet werden,
Anbietererweiterungen hinzu.
OEM-Anbieterbibliothek implementieren
Kopieren Sie zum Implementieren der OEM-Anbieterbibliothek
camera-extensions-stub
in ein Systembibliotheksprojekt. Diese Dateien definieren die Kameraerweiterungen.
.
Die camera-extensions-stub
werden in folgende Kategorien unterteilt:
Wichtige Schnittstellendateien (nicht ändern)
PreviewExtenderImpl.java
ImageCaptureExtenderImpl.java
ExtenderStateListener.java
ProcessorImpl.java
PreviewImageProcessorImpl.java
CaptureProcessorImpl.java
CaptureStageImpl.java
RequestUpdateProcessorImpl.java
ProcessResultImpl.java
advanced/AdvancedExtenderImpl.java
advanced/Camera2OutputConfigImpl.java
advanced/Camera2SessionConfigImpl.java
advanced/ImageProcessorImpl.java
advanced/ImageReaderOutputConfigImpl.java
advanced/ImageReferenceImpl.java
advanced/MultiResolutionImageReaderOutputConfigImpl.java
advanced/OutputSurfaceImpl.java
advanced/RequestProcessorImpl.java
advanced/SessionProcessorImpl.java
advanced/SurfaceOutputConfigImpl.java
Obligatorische Implementierungen (Implementierung hinzufügen)
ExtensionVersionImpl.java
InitializerImpl.java
Bokeh-Erweiterungsklassen (implementieren, wenn die Bokeh-Erweiterung unterstützt wird)
BokehImageCaptureExtenderImpl.java
BokehPreviewExtenderImpl.java
advanced/BokehAdvancedExtenderImpl.java
Nachterweiterungsklassen (implementieren, wenn die Nachterweiterung unterstützt wird)
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
advanced/NightAdvancedExtenderImpl.java
Klassen von automatischen Erweiterungen (implementieren, wenn automatische Erweiterungen unterstützt werden)
AutoImageCaptureExtenderImpl.java
AutoPreviewExtenderImpl.java
advanced/AutoAdvancedExtenderImpl.java
HDR-Extender-Klassen (implementieren, wenn die HDR-Erweiterung unterstützt wird)
HdrImageCaptureExtenderImpl.java
HdrPreviewExtenderImpl.java
advanced/HdrAdvancedExtenderImpl.java
Klassen für die Gesichtsretusche-Verlängerung (implementieren, wenn die Gesichtsretusche-Erweiterung unterstützt wird)
BeautyImageCaptureExtenderImpl.java
BeautyPreviewExtenderImpl.java
advanced/BeautyAdvancedExtenderImpl.java
Dienstprogramme (optional, können gelöscht werden)
advanced/Camera2OutputConfigImplBuilder.java
advanced/Camera2SessionConfigImplBuilder.java
Sie müssen nicht für jede Erweiterung eine Implementierung bereitstellen. Wenn Sie
Implementieren Sie keine Erweiterung, legen Sie für isExtensionAvailable()
fest, dass false
zurückgegeben wird, oder
Entfernen Sie die entsprechenden Extender-Klassen. Camera2- und CameraX-Erweiterungen
APIs melden der App, dass die Erweiterung nicht verfügbar ist.
Sehen wir uns an, wie die Camera2- und CameraX-Erweiterungs-APIs mit dem Anbieterbibliothek zum Aktivieren einer Erweiterung. Das folgende Diagramm veranschaulicht die End-to-End-Ablauf mit der Night-Erweiterung als Beispiel:
Abbildung 2: Nachterweiterung implementieren
Versionsüberprüfung:
Camera2/X ruft
ExtensionVersionImpl.checkApiVersion()
auf, um sicherzustellen, dass der Die vom OEM implementierteextensions-interface
-Version ist mit Camera2/X kompatibel. Versionen unterstützt.Initialisierung der Anbieterbibliothek:
InitializerImpl
hat die Methodeinit()
, mit der die Anbieterbibliothek initialisiert wird. Camera2/X schließt die Initialisierung ab, bevor auf die Extender-Klassen zugegriffen wird.Extender-Klassen instanziieren:
Instanziiert die Extender-Klassen für die Erweiterung. Es gibt zwei Repeater, Typen: Basic Extender und Advanced Extender. Sie müssen eine Extendertyp für alle Erweiterungen. Weitere Informationen finden Sie unter Basic Extender und Advanced Extender
Camera2/X instanziiert und interagiert mit den Extender-Klassen, um abzurufen und aktivieren Sie die Erweiterung. Kamera2/X kann für eine bestimmte Erweiterung die Extender-Klassen mehrmals instanziieren. Daher sollten Sie aufwendige Initialisierung im Konstruktor oder im Aufruf
init()
. Führen Sie die folgenden Schritte aus: nur dann schwer, wenn die Kamera kurz vor der z. B. wennonInit()
im Basic Extender aufgerufen wird oderinitSession()
wird im Advanced Extender aufgerufen.Für die Erweiterung "Night" werden die folgenden Extender-Klassen instanziiert für Basic Extender-Typ:
NightImageCaptureExtenderImpl.java
NightPreviewExtenderImpl.java
Und für den Advanced Extender-Typ:
NightAdvancedExtenderImpl.java
Verfügbarkeit von Erweiterungen prüfen:
Vor der Aktivierung der Erweiterung prüft
isExtensionAvailable()
, für die angegebene Kamera-ID über den Extender verfügbar Instanz.Extender mit Kamerainformationen initialisieren:
Camera2/X ruft
init()
für die Extender-Instanz auf und übergibt es an die Kamera. ID undCameraCharacteristics
.Informationen zur Suchanfrage:
Ruft die Extender-Klasse auf, um Informationen wie unterstützte Auflösungen zu erfassen, trotzdem die geschätzte Latenz und die Anfrageschlüssel den Extender in Vorbereitung auf die Aktivierung der Erweiterung.
Erweiterung auf dem Extender aktivieren:
Die Extender-Klasse stellt alle erforderlichen Schnittstellen zur Verfügung, um den . Es bietet einen Mechanismus, um den OEM zu fesseln Implementierung in die Camera2-Pipeline, z. B. durch das Einfügen einer Erfassungsanfrage oder die Aktivierung eines Nachverarbeitungsprogramms.
Beim erweiterten Verlängerungstyp interagiert Kamera2/X mit
SessionProcessorImpl
, um die Erweiterung zu aktivieren. Camera2/X ruft denSessionProcessorImpl
durch Aufrufen voncreateSessionProcessor()
auf der Extender
In den folgenden Abschnitten wird der Ablauf von Erweiterungen ausführlicher beschrieben.
Versionsüberprüfung
Beim Laden der OEM-Anbieterbibliothek vom Gerät zur Laufzeit
prüft, ob die Bibliothek mit der extensions-interface
-Version kompatibel ist.
Für extensions-interface
wird die semantische Versionsverwaltung verwendet.
MAJOR.MINOR.PATCH, z. B. 1.1.0 oder 1.2.0. Allerdings werden nur die
Haupt- und Nebenversionen werden bei der Versionsüberprüfung verwendet.
Zur Überprüfung der Version ruft Camera2/X
ExtensionVersionImpl.checkApiVersion()
mit den unterstützten
Version extensions-interface
. Camera2/X verwendet dann die vom
OEM-Bibliothek, um zu ermitteln, ob die Erweiterung aktiviert werden kann und welche Funktionen
aufrufen soll.
Kompatibilität mit Hauptversionen
Wenn sich die Hauptversionen der extension-interface zwischen „Kamera2/X“ und die Herstellerbibliothek enthält, gilt sie als inkompatibel und die Erweiterung deaktiviert ist.
Abwärtskompatibilität
Solange die Hauptversion identisch ist, sorgt Kamera 2/X dafür,
Abwärtskompatibilität mit OEM-Anbieterbibliotheken, die mit früheren
extensions-interface
Versionen. Wenn z. B. Camera2/X
extensions-interface
1.3.0, die OEM-Anbieterbibliotheken, die 1.0.0 implementiert haben,
1.1.0 und 1.2.0 sind weiterhin kompatibel. Das bedeutet auch, dass nach der Implementierung
bestimmte Version der Anbieterbibliothek verwenden,
stellt Camera2/X sicher, dass die Bibliothek
ist mit zukünftigen extension-interface
-Versionen abwärtskompatibel.
Aufwärtskompatibilität
Aufwärtskompatibilität mit Anbieterbibliotheken des neueren extensions-interface
hängt von Ihnen als OEM ab. Wenn Sie Funktionen zum Implementieren der Erweiterungen benötigen,
können Sie die Erweiterungen ab einer bestimmten Version aktivieren. In dieser
können Sie die unterstützte extensions-interface
-Version zurückgeben, wenn der
Die Version der Camera2/X-Bibliothek erfüllt die Anforderungen. Wenn die Camera2/X-Versionen
nicht unterstützt werden, können Sie eine inkompatible Version wie 99.0.0
die Erweiterungen zu deaktivieren.
Initialisierung der Anbieterbibliothek
Nach Überprüfung der vom OEM implementierten extensions-interface
-Version
wird der Initialisierungsprozess von Camera2/X gestartet. Die
Mit der Methode InitializerImpl.init()
wird der OEM-Bibliothek signalisiert, dass eine App es versucht
, um Erweiterungen zu verwenden.
Camera2/X sendet keine weiteren Aufrufe an die OEM-Bibliothek (abgesehen von der Versionsprüfung).
bis die OEM-Anbieterbibliothek OnExtensionsInitializedCallback.onSuccess()
aufruft.
um den Abschluss der Initialisierung zu benachrichtigen.
Sie müssen
InitializerImpl
Stand: extensions-interface
1.1.0. Camera2/X überspringt die Initialisierung der Bibliothek
wenn die OEM-Anbieterbibliothek extensions-interface
1.0.0 implementiert.
Basic Extender und Advanced Extender
Es gibt zwei Arten der Implementierung von extensions-interface
: Basic Extender und
Erweiterter Extender Advanced Extender wird seit
extensions-interface
1.2.0.
Implementieren Sie Basic Extender für Erweiterungen, die Bilder in der Kamera-HAL oder einen Postprozessor verwenden, der YUV-Streams verarbeiten kann.
Implementiere Advanced Extender für Erweiterungen, die die Kamera anpassen müssen2 Streamkonfiguration an und senden bei Bedarf Erfassungsanfragen.
Den Vergleich sehen Sie in der folgenden Tabelle:
Basic Extender | Erweiterter Repeater | |
---|---|---|
Streamkonfigurationen | Fest Vorschau: PRIVATE oder YUV_420_888 (falls Prozessor vorhanden) Standbild: JPEG oder YUV_420_888 (falls Prozessor vorhanden)
|
Anpassbar durch OEM. |
Aufnahmeanfrage wird gesendet | Nur Camera2/X kann Aufnahmeanfragen senden. Sie können die Parameter auf diese Anträge stellen. Wenn der Prozessor für die Bilderfassung bereitgestellt wird, stellt Camera2/X mehrere Aufnahmeanfragen senden, alle Bilder senden an den Prozessor weitergegeben werden. | Eine RequestProcessorImpl -Instanz wird Ihnen zur Verfügung gestellt, um
die Kamera2-Erfassungsanfrage aus, um Ergebnisse und Bild abzurufen.
Camera2/X ruft |
Aufhänger in der Kamera-Pipeline |
|
|
Geeignet für | Erweiterungen, die im Kamera-HAL oder in einem Prozessor implementiert sind, der YUV-Bilder. |
|
Unterstützte API-Version | Kamera2-Erweiterungen: Android 13 oder höher CameraX-Erweiterungen: camera-extensions 1.1.0 oder höher |
Kamera2-Erweiterungen: Android 12L oder höher CameraX-Erweiterungen: camera-extensions 1.2.0-alpha03 oder höher |
App-Abläufe
Die folgende Tabelle zeigt drei Arten von App-Abläufen und ihre Camera Extensions API-Aufrufe an. Camera2/X hingegen bietet APIs erforderlich sind, müssen Sie die Anbieterbibliothek ordnungsgemäß implementieren. die in einem späteren Abschnitt ausführlicher beschrieben werden.
Kamera2-Erweiterungen | CameraX-Erweiterungen | |
---|---|---|
Verfügbarkeit von Suchanfragenerweiterungen | CameraExtensionCharacteristics
.getSupportedExtensions
|
ExtensionsManager.
isExtensionAvailable
|
Informationen zur Suchanfrage | CameraExtensionCharacteristics.
getExtensionSupportedSizes
CameraExtensionCharacteristics.
getEstimatedCaptureLatencyRangeMillis
CameraExtensionCharacteristics.
getAvailableCaptureRequestKeys
CameraExtensionCharacteristics.
getAvailableCaptureResultKeys
|
ExtensionsManager.
getEstimatedCaptureLatencyRange
Die restlichen Informationen innerhalb der Bibliothek werden von CameraX verarbeitet. |
Vorschau und Fotoaufnahme mit aktivierter Erweiterung | CameraDevice.
createExtensionSession
|
val cameraSelector = ExtensionsManager.
getExtensionEnabledCameraSelector
|
Basic Extender
Die Oberfläche des Basic Extenders bietet Haken an verschiedenen Stellen der Kamera. zu erstellen. Für jeden Erweiterungstyp gibt es entsprechende Extender-Klassen, die OEMs benötigen. zu implementieren.
In der folgenden Tabelle sind die Extender-Klassen aufgeführt, die OEMS für die einzelnen Extender-Klassen implementieren müssen. Erweiterung:
Zu implementierende Extender-Klassen | |
---|---|
Nacht | NightPreviewExtenderImpl.java
|
HDR | HdrPreviewExtenderImpl.java
|
Automatisch | AutoPreviewExtenderImpl.java
|
Bokeh | BokehPreviewExtenderImpl.java
|
Gesichtsretusche | BeautyPreviewExtenderImpl.java
|
Wir verwenden PreviewExtenderImpl
und ImageCaptureExtenderImpl
als Platzhalter
im folgenden Beispiel. Ersetzen Sie sie durch die Namen der
die Sie implementieren.
Basic Extender hat folgende Funktionen:
- Sitzungsparameter bei der Konfiguration von
CameraCaptureSession
einfügen (onPresetSession
). - Benachrichtigt Sie über Start- und Schließereignisse der Erfassungssitzung und senden Sie eine
Anfrage zur Benachrichtigung des HAL mit den zurückgegebenen Parametern (
onEnableSession
,onDisableSession
). - Erfassungsparameter für die Anfrage einfügen
(
PreviewExtenderImpl.getCaptureStage
,ImageCaptureExtenderImpl.getCaptureStages
). - Prozessoren für die Vorschau hinzufügen und trotzdem verarbeitungsfähige Prozessoren erfassen
Stream "
YUV_420_888
".
Sehen wir uns an, wie Camera2/X die extensions-interface
aufruft, um die drei
wie oben beschrieben.
App-Ablauf 1: Verfügbarkeit von Erweiterungen prüfen
Abbildung 3: App-Ablauf 1 auf dem Basic Extender
Bei diesem Ablauf ruft Camera2/X die Methode isExtensionAvailable()
des
sowohl PreviewExtenderImpl
als auch ImageCaptureExtenderImpl
ohne
init()
. Beide Extender-Klassen müssen true
zurückgeben, um die Erweiterungen zu aktivieren.
Dies ist oft der erste Schritt für Apps, um zu prüfen, ob die jeweilige Erweiterung wird für eine bestimmte Kamera-ID unterstützt, bevor Sie die Erweiterung aktivieren. Das liegt daran, dass einige Erweiterungen nur für bestimmte Kamera-IDs unterstützt werden.
Anwendungsfluss 2: Abfrageinformationen
Abbildung 4: App-Ablauf 2 auf dem Basic Extender
Nachdem ermittelt wurde, ob die Erweiterung verfügbar ist, sollten Apps abfragen die folgenden Informationen, bevor Sie die Erweiterung aktivieren.
Latenzbereich erfassen:
ImageCaptureExtenderImpl.getEstimatedCaptureLatencyRange
gibt den Bereich die Erfassungslatenz, damit die App beurteilen kann, ob die Erweiterung für das aktuelle Szenario zu aktivieren.Unterstützte Größen für die Vorschau- und Erfassungsoberfläche:
ImageCaptureExtenderImpl.getSupportedResolutions
undPreviewExtenderImpl.getSupportedResolutions
gibt eine Liste mit Bildformaten zurück. die für das Oberflächenformat und die -größe unterstützt werden.Unterstützte Anfrage- und Ergebnisschlüssel: Camera2/X ruft die folgenden Methoden auf, um die unterstützte Aufnahme abzurufen. Anforderungsschlüssel und Ergebnisschlüssel aus Ihrer Implementierung:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys
ImageCaptureExtenderImpl.getAvailableCapturetResultKeys
Camera2/X ruft bei diesen Extender-Klassen vor der Abfrage immer zuerst init()
auf
.
App-Ablauf 3: Vorschau/Aufnahme mit aktivierter Erweiterung (HAL-Implementierung)
Abbildung 5: App-Ablauf 3 auf dem Basic Extender
Das Diagramm oben zeigt den Hauptablauf beim Aktivieren der Vorschau. mit einer Erweiterung ohne Auftragsverarbeiter aufnehmen können. Das bedeutet, dass der Kamera-HAL verarbeitet die Erweiterung.
Bei diesem Ablauf ruft Camera2/X zuerst init()
und dann onInit
auf, wodurch du benachrichtigt wirst.
dass eine Kamerasitzung mit den angegebenen Erweiterungen beginnt.
Eine umständliche Initialisierung ist in onInit()
möglich.
Beim Konfigurieren von CameraCaptureSession
ruft Camera2/X
onPresetSession
zum Abrufen der Sitzungsparameter. Nach der Aufnahme
aktiviert, ruft Camera2/X onEnableSession
auf und gibt
CaptureStageImpl
-Instanz, die die Erfassungsparameter enthält. Kamera2/X
sendet sofort eine einzelne Anfrage mit diesen Erfassungsparametern, um den
HAL. Vor dem Schließen der Aufnahmesitzung ruft Camera2/X
onDisableSession
und sendet dann eine einzelne Anfrage mit der zurückgegebenen Aufnahme.
Parameter.
Die sich wiederholende Anfrage, die von Camera2/X ausgelöst wird, enthält die Anfrageparameter.
zurückgegeben von PreviewExtenderImpl.getCaptureStage()
. Darüber hinaus ist das
Erfassungsanfrage die Parameter enthält, die von
ImageCaptureExtenderImpl.getCaptureStages()
Schließlich ruft Camera2/X onDeInit()
auf, nachdem die Kamerasitzung beendet wurde.
Sie können Ressourcen in onDeinit()
freigeben.
Vorschauprozessor
Zusätzlich zum Kamera-HAL können Sie auch Erweiterungen in einem Prozessor implementieren.
PreviewExtenderImpl.getProcessorType
implementieren, um den Prozessortyp anzugeben
wie unten erläutert:
PROCESSOR_TYPE_NONE
: Kein Prozessor. Bilder werden in der Kamera verarbeitet HAL.PROCESSOR_TYPE_REQUEST_UPDATE_ONLY
:Mit dem Prozessortyp können Sie Aktualisieren Sie die wiederkehrende Anfrage mit neuen Parametern für die Erfassungsanfrage, spätesteTotalCaptureResult
.PreviewExtenderImpl.getProcessor
muss Folgendes zurückgeben:RequestUpdateProcessorImpl
-Instanz, die dieTotalCaptureResult
-Instanz verarbeitet und eineCaptureStageImpl
-Instanz, um die wiederkehrende Anfrage zu aktualisieren.PreviewExtenderImpl.getCaptureStage()
sollte auch das Ergebnis von Verarbeitung ausführen und das neuesteCaptureStageImpl
zurückgeben.PROCESSOR_TYPE_IMAGE_PROCESSOR
:Mit diesem Typ können Sie verarbeitet, umYUV_420_888
Bilder zu verarbeiten und die Ausgabe in einenPRIVATE
.Sie müssen eine
PreviewImageProcessorImpl
Instanz inPreviewExtenderImpl.getProcessor
. Der Auftragsverarbeiter ist für zur Verarbeitung vonYUV_420_888
Eingabebildern verwendet. Die Ausgabe sollte in den VorschauformatPRIVATE
. Für Kamera 2/X wird stattdessen eineYUV_420_888
-Oberfläche verwendet vonPRIVATE
, umCameraCaptureSession
für die Vorschau zu konfigurieren.Den Ablauf sehen Sie in der folgenden Abbildung:
Abbildung 6: Vorschau mit PreviewImageProcessorImpl
Die PreviewImageProcessorImpl
-Schnittstelle erweitert ProcessImpl
und hat
drei wichtige Methoden:
onOutputSurface(Surface surface, int imageFormat)
legt die Ausgabeoberfläche fest für den Prozessor. BeiPreviewImageProcessorImpl
istimageFormat
ein Pixel Format wiePixelFormat.RGBA_8888
.onResolutionUpdate(Size size)
legt die Größe des Eingabebilds fest.Mit
onImageFormatUpdate(int imageFormat)
wird das Bildformat der Eingabe festgelegt. Bild. Derzeit können maximalYUV_420_888
Zeichen verwendet werden.
Bilderfassungsprozessor
Für Standbilder können Sie einen Prozessor implementieren, indem Sie eine
CaptureProcessorImpl
Instanz mit ImageCaptureExtenderImpl.getCaptureProcessor
. Der Prozessor ist
Verantwortlich für die Verarbeitung einer Liste erfasster YUV_420_888
Bilder und
TotalCaptureResult
-Instanzen und schreiben die Ausgabe in eine YUV_420_888
-Oberfläche.
Sie können davon ausgehen, dass die Vorschau aktiviert ist und ausgeführt wird, bevor Sie den Anfrage trotzdem erfassen.
Siehe den Ablauf im folgenden Diagramm:
Abbildung 7: Vorgang mit CaptureProcessorImpl
wird noch aufgenommen
Camera2/X verwendet zur Konfiguration eine Oberfläche des
YUV_420_888
-Formats für Standbilder. während der Aufnahme. Camera2/X bereitetCaptureProcessorImpl
durch folgenden Aufruf vor:CaptureProcessorImpl.onImageFormatUpdate()
mitYUV_420_888
.CaptureProcessorImpl.onResolutionUpdate()
durch die Größe des eingegebenen Bilds.CaptureProcessorImpl.onOutputSurface()
mit der AusgabeYUV_420_888
Oberfläche.
ImageCaptureExtenderImpl.getCaptureStages
gibt eine Liste mitCaptureStageImpl
, wobei jedes Element einerCaptureRequest
-Instanz mit Erfassungsparametern zugeordnet ist. die von Camera2/X gesendet werden. Wird z. B. eine Liste mit drei Elementen zurückgegeben,CaptureStageImpl
Instanzen sendet Camera2/X drei Aufnahmeanfragen mit entsprechenden Erfassungsparametern mithilfe dercaptureBurst
der API erstellen.Die empfangenen Images und
TotalCaptureResult
Instanzen werden zu einem Bundle zusammengefasst und zur Verarbeitung anCaptureProcessorImpl
gesendet.CaptureProcessorImpl
schreibt das Ergebnisbild im FormatYUV_420_888
in den die durch den AufrufonOutputSurface()
angegebene Ausgabeoberfläche. Camera2/X konvertiert sie in JPEG-Bilder umwandeln.
Schlüssel und Ergebnisse für Erfassungsanfragen unterstützen
Neben der Kameravorschau und -aufnahme können Apps auch Zoom, oder einen Tap-to-Focus-Effekt auslösen. Diese Parameter sind möglicherweise nicht die mit Ihrer Erweiterungsimplementierung kompatibel sind.
Die folgenden Methoden wurden zu extensions-interface
1.3.0 hinzugefügt, um
können Sie die von Ihrer Implementierung unterstützten Parameter freigeben:
ImageCaptureExtenderImpl.getAvailableCaptureRequestKeys()
gibt den Fehlerwert von Ihrer Implementierung unterstützte Anfrageschlüssel erfassen.ImageCaptureExtenderImpl.getAvailableCaptureResultKeys()
gibt den Fehlerwert Erfassungsergebnisschlüssel, die im Erfassungsergebnis enthalten sind.
Wenn der Kamera-HAL die Erweiterung verarbeitet, ruft Camera2/X die Aufnahme ab.
Ergebnisse auf CameraCaptureSession.CaptureCallback
. Wenn jedoch
implementiert ist, ruft Camera2/X die Erfassungsergebnisse
ProcessResultImpl
, die an die process()
übergeben wird
Methode in
PreviewImageProcessorImpl
und
CaptureProcessorImpl
Sie sind für die Berichterstellung verantwortlich
das Aufnahmeergebnis über ProcessResultImpl
an Camera2/X senden.
Unten finden Sie ein Beispiel in der Definition der CaptureProcessorImpl
-Schnittstelle.
Ab extensions-interface
1.3.0 wird der zweite process()
-Aufruf aufgerufen:
Interface CaptureProcessorImpl extends ProcessorImpl {
// invoked when extensions-interface version < 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results);
// invoked when extensions-interface version >= 1.3.0
void process(Map<Integer, Pair<Image, TotalCaptureResult>> results,
ProcessResultImpl resultCallback, Executor executor);
}
Für gängige Kamerafunktionen wie Zoomen, Tippen für Fokus, Blitz und Belichtung empfehlen wir, die folgenden Schlüssel sowohl für die Anfrage- und Erfassungsergebnis:
- Zoomen:
<ph type="x-smartling-placeholder">
- </ph>
CaptureRequest#CONTROL_ZOOM_RATIO
CaptureRequest#SCALER_CROP_REGION
- Zum Fokussieren tippen:
<ph type="x-smartling-placeholder">
- </ph>
CaptureRequest#CONTROL_AF_MODE
CaptureRequest#CONTROL_AF_TRIGGER
CaptureRequest#CONTROL_AF_REGIONS
CaptureRequest#CONTROL_AE_REGIONS
CaptureRequest#CONTROL_AWB_REGIONS
- Flash:
<ph type="x-smartling-placeholder">
- </ph>
CaptureRequest#CONTROL_AE_MODE
CaptureRequest#CONTROL_AE_PRECAPTURE_TRIGGER
CaptureRequest#FLASH_MODE
- Belichtungskorrektur:
<ph type="x-smartling-placeholder">
- </ph>
CaptureRequest#CONTROL_AE_EXPOSURE_COMPENSATION
Bei Basic Extendern mit Version 1.2.0 oder älteren Versionen enthält die CameraX-
Die Extensions API unterstützt explizit alle oben genannten Schlüssel. Für
extensions-interface
1.3.0 wird sowohl von CameraX als auch von Camera2 die zurückgegebene Liste berücksichtigt
und unterstützen nur die darin enthaltenen Schlüssel. Wenn Sie sich z. B. dafür entscheiden,
nur CaptureRequest#CONTROL_ZOOM_RATIO
und
CaptureRequest#SCALER_CROP_REGION
in der Implementierung von Version 1.3.0 geändert hat,
bedeutet, dass von der App nur Zoomen unterstützt wird, während Tap-to-Fokus, Blitz und Belichtung unterstützt werden.
Vergütungen nicht zulässig sind.
Erweiterter Repeater
Advanced Extender ist eine Anbieterimplementierung, die auf der Camera2 API basiert.
Dieser Extender-Typ wurde in extensions-interface
1.2.0 hinzugefügt. Je nach
Gerätehersteller können Erweiterungen
auf der App-Ebene implementiert werden,
Dies hängt von folgenden Faktoren ab:
Benutzerdefinierte Streamkonfiguration:Benutzerdefinierte Streams wie RAW-Streams konfigurieren oder mehrere Streams für unterschiedliche IDs für physische Kameras haben.
Funktion zum Senden von Camera2-Anfragen:Unterstützung einer komplizierten Interaktion eine Logik, die Erfassungsanfragen mit Parametern auf der Grundlage der Ergebnisse von vorherigen Anträgen.
Advanced Extender stellt einen Wrapper oder eine Zwischenebene bereit, damit Sie die Streamkonfiguration anpassen und bei Bedarf Erfassungsanfragen senden.
Zu implementierende Dateien
Um zur Implementierung des Advanced Extenders zu wechseln, muss der
isAdvancedExtenderImplemented()
-Methode in
ExtensionVersionImpl
muss true
zurückgeben. Für jeden Erweiterungstyp müssen OEMs die
entsprechenden Extender-Klassen. Die Implementierungsdateien für Advanced Extender werden
im Paket advanced.
Zu implementierende Extender-Klassen | |
---|---|
Nacht | advanced/NightAdvancedExtenderImpl.java
|
HDR | advanced/HdrAdvancedExtenderImpl.java
|
Automatisch | advanced/AutoAdvancedExtenderImpl.java
|
Bokeh | advanced/BokehAdvancedExtenderImpl.java
|
Gesichtsretusche | advanced/BeautyAdvancedExtenderImpl.java
|
Im folgenden Beispiel wird AdvancedExtenderImpl
als Platzhalter verwendet.
Ersetzen Sie ihn durch den Namen der Extender-Datei für die Erweiterung, die Sie verwenden möchten.
bei der Umsetzung.
Sehen wir uns an, wie Camera2/X die extensions-interface
aufruft, um die drei
App-Flows.
App-Ablauf 1: Verfügbarkeit von Erweiterungen prüfen
Abbildung 8: App-Ablauf 1 auf Advanced Extender
Zuerst prüft die App, ob die jeweilige Erweiterung unterstützt wird.
Anwendungsfluss 2: Abfrageinformationen
Abbildung 9: App-Ablauf 2 auf Advanced Extender
Nach dem Aufrufen von AdvancedExtenderImpl.init()
kann die App die
auf die folgenden Informationen zu AdvancedExtenderImpl
:
Geschätzte Latenz für die Aufnahme nach wie vor:
AdvancedExtenderImpl.getEstimatedCaptureLatencyRange()
gibt den Bereich die Erfassungslatenz, damit die App beurteilen kann, ob die Erweiterung für das aktuelle Szenario zu aktivieren.Unterstützte Auflösungen für Vorschau und Bildaufnahme:
AdvancedExtenderImpl.getSupportedPreviewOutputResolutions()
gibt eine Karte zurück. des Bildformats der Liste der Größen hinzu, die für das Vorschauformat unterstützt werden. und Größe. OEMs müssen mindestens das FormatPRIVATE
unterstützen.AdvancedExtenderImpl.getSupportedCaptureOutputResolutions()
gibt den Fehlerwert unterstützte Formate und Größen für die weiterhin erfasste Oberfläche. OEMs müssen sowohl Ausgabe im FormatJPEG
undYUV_420_888
.AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
gibt den Fehlerwert unterstützte Größen für einen zusätzlichenYUV_420_888
-Stream für die Bildanalyse. Wenn die die Bildanalyse YUV-Oberfläche nicht unterstützt,getSupportedYuvAnalysisResolutions()
solltenull
oder eine leere Liste zurückgeben.
Verfügbare Schlüssel/Ergebnisse für Erfassungsanfragen (in
extensions-interface
1.3.0 hinzugefügt): Camera2/X ruft die folgenden Methoden auf, um die unterstützte Aufnahme abzurufen. Anforderungsschlüssel und Ergebnisschlüssel aus Ihrer Implementierung:AdvancedExtenderImpl.getAvailableCaptureRequestKeys
AdvancedExtenderImpl.getAvailableCaptureResultKeys
Weitere Informationen finden Sie unter Erfassen Sie Anfrageschlüssel und Ergebnisse.
App-Ablauf 3: Vorschau/Aufnahme mit aktivierter Erweiterung
Abbildung 10. App-Ablauf 3 auf Advanced Extender
Das Diagramm oben zeigt den Hauptablauf für den Start der Vorschau und die Erfassung Advanced Extender-Typ Sehen wir uns die einzelnen Schritte im Einzelnen an.
SessionProcessorImpl
InstanzDie zentrale Implementierung des Advanced Extenders befindet sich in
SessionProcessorImpl
. ist für die Bereitstellung einer benutzerdefinierten Sitzungskonfiguration und Anfragen erfassen, um die Vorschau zu starten und dennoch die Anfrage zu erfassen.AdvancedExtenderImpl.createSessionProcessor()
wird aufgerufen, um den ParameterSessionProcessorImpl
-Instanz.initSession
SessionProcessorImpl.initSession()
initialisiert die Sitzung für die Erweiterung. Hier ordnen Sie Ressourcen zu und geben eine Sitzungskonfiguration fürCameraCaptureSession
wird vorbereitet.Bei den Eingabeparametern gibt Camera2/X die Konfigurationen der Ausgabefläche an. für Vorschau, Stillerfassung und eine optionale YUV-Bildanalyse. Diese Ausgabe Die Flächenkonfiguration (
OutputSurfaceImpl
) enthält die Oberfläche, die Größe und das Bild. -Format, die mit den folgenden Methoden inAdvancedExtenderImpl
abgerufen werden:getSupportedPreviewOutputResolutions()
getSupportedCaptureOutputResolutions()
getSupportedYuvAnalysisResolutions()
Sie müssen eine
Camera2SessionConfigImpl
-Instanz zurückgeben, die aus einem Liste derCamera2OutputConfigImpl
-Instanzen und der verwendeten Sitzungsparameter zum Konfigurieren vonCameraCaptureSession
. Sie sind verantwortlich für Ausgabe der richtigen Kamerabilder an die Ausgabeoberflächen, die von Camera2/X. Hier sind einige Optionen zum Aktivieren der Ausgabe:- Verarbeitung in Kamera-HAL:Sie können die Ausgabeflächen direkt hinzufügen.
nach
CameraCaptureSession
mitSurfaceOutputConfigImpl
Implementierung. Dadurch wird die bereitgestellte Ausgabeoberfläche für die Kamera konfiguriert und ermöglicht es dem Kamera-HAL, das Bild zu verarbeiten. Verarbeitung der
ImageReader
-Zwischenoberfläche (RAW, YUV usw.): Füge dieImageReader
-Zwischenlandungen in RichtungCameraCaptureSession
mit einemImageReaderOutputConfigImpl
-Instanz.Sie müssen die Zwischenbilder verarbeiten und das Ergebnisbild in die Ausgabeoberfläche.
- Kamerabereich teilen:Sie können eine andere Oberfläche verwenden, um sie mit anderen zu teilen.
indem Sie eine beliebige
Camera2OutputConfigImpl
-Instanz zumgetSurfaceSharingOutputConfigs()
-Methode einer anderenCamera2OutputConfigImpl
-Instanz. Format und Größe der Oberfläche müssen identisch.
Alle
Camera2OutputConfigImpl
, einschließlichSurfaceOutputConfigImpl
undImageReaderOutputConfigImpl
muss eine eindeutige ID (getId()
) haben: wird verwendet, um die Zieloberfläche anzugeben und das Bild vonImageReaderOutputConfigImpl
onCaptureSessionStart
undRequestProcessorImpl
Wenn
CameraCaptureSession
gestartet wird und das Kamera-Framework aufruft,onConfigured()
, dann ruft Camera2/X aufSessionProcessorImpl.onCaptureSessionStart()
mit der Camera2-Anfrage WrapperRequestProcessImpl
. Camera2/X implementiertRequestProcessImpl
, Damit können Sie die Erfassungsanfragen ausführen. Bilder abrufen, wennImageReaderOutputConfigImpl
verwendet wirdDie
RequestProcessImpl
-APIs ähneln denen von Camera2.CameraCaptureSession
APIs in Bezug auf das Ausführen von Anfragen. Es gibt folgende Unterschiede:- Die Zieloberfläche wird durch die ID des
Camera2OutputConfigImpl
-Instanz. - Die Fähigkeit zum Abrufen des Bildes von
ImageReader
.
Sie können
RequestProcessorImpl.setImageProcessor()
mit einem bestimmtenCamera2OutputConfigImpl
-ID, bei der eineImageProcessorImpl
-Instanz registriert werden soll Bilder empfangen.Die Instanz
RequestProcessImpl
wird nach Camera2/X-Aufrufen ungültigSessionProcessorImpl.onCaptureSessionEnd()
.- Die Zieloberfläche wird durch die ID des
Vorschau starten und ein Bild aufnehmen
In der Advanced Extender-Implementierung kannst du Erfassungsanfragen senden über die
RequestProcessorImpl
-Schnittstelle. Camera2/X benachrichtigt dich, wenn die wiederholte Anfrage für die Vorschau oder die stille Aufnahmesequenz starten, indem SieSessionProcessorImpl#startRepeating
wird angerufen undSessionProcessorImpl#startCapture
. Aufnahme senden -Anfragen erfüllen, die diesen Vorschau- und trotzdem Erfassungsanfragen entsprechen.Camera2/X legt auch die Parameter für die Erfassungsanfrage über
SessionProcessorImpl#setParameters
Sie müssen diese Anfrageparameter festlegen (wenn Parameter unterstützt werden) sowohl bei wiederkehrenden als auch bei Einzelanfragen.Sie müssen mindestens
CaptureRequest.JPEG_ORIENTATION
unterstützen undCaptureRequest.JPEG_QUALITY
.extensions-interface
1.3.0 unterstützt Anfragen und Ergebnisschlüssel, die mit den folgenden Methoden bereitgestellt werden:AdvancedExtenderImpl.getAvailableCaptureRequestKeys()
AdvancedExtenderImpl.getAvailableCaptureResultKeys()
Wenn Entwickler die Schlüssel in der
getAvailableCaptureRequestKeys
-Liste festlegen, müssen Sie die Parameter aktivieren und sicherstellen, dass die Erfassung Ergebnis enthält die Schlüssel in dergetAvailableCaptureResultKeys
-Liste.startTrigger
SessionProcessorImpl.startTrigger()
wird aufgerufen, um den Trigger folgendermaßen zu starten: alsCaptureRequest.CONTROL_AF_TRIGGER
undCaptureRequest.CONTROL_AE_PRECAPTURE_TRIGGER
Sie können alle Anfrageschlüssel erfassen, die nicht inAdvancedExtenderImpl.getAvailableCaptureRequestKeys()
startTrigger()
wird seitextensions-interface
1.3.0 unterstützt. Es ermöglicht es Apps, Tap-to-Fokus und Flash mit Erweiterungen zu implementieren.Aufräumen
Am Ende einer Aufnahme
SessionProcessorImpl.onCaptureSessionEnd()
wird vor dem Schließen aufgerufenCameraCaptureSession
. Nach der AufnahmedeInitSession()
führt die Bereinigung durch.
Unterstützung für Vorschau, Bilderfassung und Bildanalyse
Sie sollten die Erweiterung sowohl auf die Vorschau anwenden als auch Anwendungsfälle erfassen. Ist die Latenz jedoch zu hoch, um die Vorschau reibungslos anzuzeigen, können Sie die Erweiterung nur für Standaufnahmen anwenden.
Unabhängig davon, ob die Erweiterung für die Vorschau aktiviert ist,
müssen Sie sowohl ImageCaptureExtenderImpl
als auch PreviewExtenderImpl
implementieren
für eine bestimmte Erweiterung. Häufig verwendet eine App auch einen YUV-Stream, um den Messwert
Bildinhalte wie QR-Codes oder Text zu finden Um diesen Anwendungsfall besser zu unterstützen,
, sollten Sie die Stream-Kombination aus Vorschau, Standbildaufnahme und
YUV_420_888
-Stream zum Konfigurieren von CameraCaptureSession
. Das bedeutet,
einen Prozessor implementieren,
den Stream zu unterstützen,
Kombination aus drei YUV_420_888
-Streams.
Bei Advanced Extender übergibt Camera2/X drei Ausgabeflächen an den
SessionProcessorImpl.initSession()
Anruf. Diese Ausgabeoberflächen sind für die Vorschau bestimmt
, Standbildaufnahme und Bildanalyse. Sie müssen sicherstellen, dass die Vorschau
und trotzdem die Ausgabeoberflächen
die gültige Ausgabe anzeigen. Für das Bild
analysieren und sicherstellen, dass sie nur funktioniert, wenn sie nicht null ist. Wenn Ihr
Implementierung den Bildanalyse-Stream nicht unterstützen kann, können Sie ein leeres
Liste auf AdvancedExtenderImpl.getSupportedYuvAnalysisResolutions()
. Dieses
stellt sicher, dass die Ausgabeoberfläche der Bildanalyse in
SessionProcessorImpl.initSession()
Supportvideoaufnahme
Die aktuelle Architektur der Kameraerweiterung unterstützt nur die Vorschau und trotzdem
Anwendungsfälle zu erfassen. Das Aktivieren der Erweiterung auf der MediaCodec
wird nicht unterstützt
oder MediaRecorder
Oberflächen zum Aufnehmen des Videos. Es ist jedoch möglich,
damit Apps die Vorschauausgabe aufzeichnen können.
Die Unterstützung von MediaCodec
- und MediaRecorder
-Oberflächen wird derzeit geprüft.
Erweiterungsspezifische Metadaten
Erweiterungsspezifische Metadaten für Android 14 und höher
Ermöglicht es Kunden mit Kameraerweiterung, erweiterungsspezifische Aufnahmen einzurichten und zu empfangen
Einstellungen und Ergebnisse für Anfragen. Insbesondere die Kameraerweiterung
Clients können den Anfrageparameter EXTENSION_STRENGTH
zur Erfassung von Daten verwenden,
die Erweiterungsstärke und das EXTENSION_CURRENT_TYPE
-Erfassungsergebnis,
geben Sie den aktivierten Erweiterungstyp an.
Anfragen erfassen
Die
EXTENSION_STRENGTH
Anforderungsparameter erfassen
steuert die Stärke des Nachbearbeitungseffekts der Erweiterung. Die entsprechenden
Das Erfassungsergebnis enthält den Standardwert für die Stärke, wenn dieser Parameter nicht festgelegt ist
explizit durch die Kundschaft. Dieser Parameter kann auf folgende Arten angewendet werden:
Erweiterungstypen:
BOKEH
: Steuert das Ausmaß der Unschärfe.HDR
undNIGHT
: Steuert die Menge an verschmelzten Bildern und die Helligkeit der das endgültige Bild.FACE_RETOUCH
: Steuert den Grad der kosmetischen Verbesserung und der Haut. Glättung.
Der unterstützte Bereich für den Parameter EXTENSION_STRENGTH
liegt zwischen 0
und
100
, wobei 0
angibt, dass keine Erweiterungsverarbeitung oder einfaches Passthrough erfolgt.
100
gibt die maximale Erweiterungsstärke des Verarbeitungseffekts an.
Wenn Sie EXTENSION_STRENGTH
unterstützen möchten, verwenden Sie den Anbieter
APIs für spezifische Parameter, die in Version 1.3.0 der Erweiterungsbibliothek eingeführt wurden
. Weitere Informationen finden Sie unter
getAvailableCaptureRequestKeys()
Ergebnisse erfassen
Die
EXTENSION_CURRENT_TYPE
Mit dem Erfassen des Ergebnisses können
die Implementierungen von Erweiterungen Kunden über die aktiven
Erweiterungstyp.
Weil Erweiterungen mit dem Typ AUTO
dynamisch zwischen Erweiterungen wechseln
wie HDR
und NIGHT
, je nach Umgebungsbedingungen,
Erweiterungen, die Apps EXTENSION_CURRENT_TYPE
verwenden können, um Informationen über
Die aktuell von der Erweiterung „AUTO
“ ausgewählte Erweiterung.
Latenzschätzung dennoch in Echtzeit erfassen
Kamera-Erweiterungs-Clients für Android 14 und höher
in Echtzeit abfragen und trotzdem Latenzschätzungen anhand der Szene und
die Umgebungsbedingungen mithilfe
getRealtimeStillCaptureLatency()
Dieses
genauere Schätzungen als die statische Methode,
getEstimatedCaptureLatencyRangeMillis()
. Basierend auf der Latenzschätzung können Apps entscheiden, ob die Erweiterung übersprungen werden soll
oder die Anzeige eines Hinweises
darüber, dass die Nutzenden über eine
ausgeführt wird.
CameraExtensionSession.StillCaptureLatency latency;
latency = extensionSession.getRealtimeStillCaptureLatency();
// The capture latency from ExtensionCaptureCallback#onCaptureStarted() until ExtensionCaptureCallback#onCaptureProcessStarted().
latency.getCaptureLatency();
// The processing latency from ExtensionCaptureCallback#onCaptureProcessStarted() until the processed frame returns to the client.
latency.getProcessingLatency();
Um weiterhin Latenzschätzungen in Echtzeit zu erfassen, implementieren Sie Folgendes:
- Einfache Erweiterungen:
ImageCaptureExtenderImpl.getRealtimeCaptureLatency()
- Erweiterte Erweiterungen:
SessionProcessorImpl.getRealtimeCaptureLatency
Callbacks für den Aufnahmefortschritt
Kamera-Erweiterungs-Clients für Android 14 und höher Kann Rückrufe für den Fortschritt einer lange laufenden Erfassungsverarbeitung erhalten Geschäftsabläufe. Apps können Nutzern den aktuellen Fortschritt anzeigen, um die User Experience insgesamt.
Apps können den folgenden Code verwenden, um diese Funktion zu integrieren:
import android.hardware.camera2.CameraExtensionSession.
ExtensionCaptureCallback;
{
…
class AppCallbackImpl extends ExtensionCaptureCallback {
…
@Override
public void onCaptureProcessProgressed(
@NonNull CameraExtensionSession session,
@NonNull CaptureRequest request,
@IntRange(from = 0, to = 100) int progress) {
// Update app UI with current progress
}
}
…
}
Damit Callbacks für den Verarbeitungsfortschritt bei der Erfassung unterstützt werden, muss Ihr Erweiterungsanbieter Die Implementierung muss die folgenden Callbacks mit dem aktuellen Fortschritt aufrufen Wert:
- Einfache Erweiterungen:
ProcessResultImpl.onCaptureProcessProgressed()
- Erweiterte Erweiterungen:
CaptureCallback.onCaptureProcessProgressed()
Postview-Standbild erfassen
Ab Android 14 können Kameraerweiterungen
Postview (Vorschaubild) mithilfe von
setPostviewOutputConfiguration
Zur Verbesserung der Nutzererfahrung können Apps ein Postview-Bild als
wenn eine Erweiterung
eine erhöhte Verarbeitungslatenz aufweist.
und ersetzen Sie das Bild, sobald das fertige Bild verfügbar ist. Apps können konfigurieren
und Postview-Erfassungsanfragen mit dem folgenden Referenzcode senden:
{
…
if (!CameraExtensionCharacteristics.isPostviewAvailable()) {
continue;
}
…
ExtensionSessionConfiguration extensionConfiguration = new
ExtensionSessionConfiguration(
CameraExtensionCharacteristics.EXTENSION_NIGHT,
outputConfig,
backgroundExecutor,
extensionSessionStateCallback
);
extensionConfiguration.setPostviewOutputConfiguration(
postviewImageOutput);
…
CaptureRequest.Builder captureRequestBuilder =
cameraDevice.createCaptureRequest(
CameraDevice.TEMPLATE_STILL_CAPTURE);
captureRequestBuilder.addTarget(stillImageReader.getSurface());
captureRequestBuilder.addTarget(postviewImageSurface);
CaptureRequest captureRequest = captureRequestBuilder.build();
…
}
Damit die Postview-Erfassung weiterhin unterstützt wird, muss in Ihrer Anbieterimplementierung die Methode Folgendes:
Einfache Erweiterungen:
CaptureProcessorImpl.onPostviewOutputSurface
undCaptureProcessorImpl.processWithPostview
Erweiterte Erweiterungen:
SessionProcessorImpl.startCaptureWithPostview
SurfaceView-Ausgabe
Kamera-Erweiterungs-Clients für Android 14 und höher
können leistungs- und leistungsoptimierte Vorschau-Renderingpfade nutzen, indem ein
SurfaceView
Instanz für die Vorschauausgabe für wiederkehrende Anfragen.
Damit die Ausgabe von SurfaceView
unterstützt wird, muss die Implementierung der Anbietererweiterung so aussehen:
in der Lage, Streaming und Vorschau an SurfaceView
Instanzen auszugeben. Bis
Prüfen Sie, ob dies unterstützt wird, führen Sie den SurfaceViewExtensionPreviewTest.java
aus.
CTS-Modul.
Anbieterspezifische Sitzungstypen
Mit dieser Funktion kann bei Implementierungen der Anbietererweiterung ein anbieterspezifischer Sitzungstyp ausgewählt werden, der bei der Aufnahme mit der internen Kamera statt des Standardwerts festgelegt wird.
Die Funktion ist vollständig innerhalb des Frameworks und Anbieter-Stacks integriert und hat keine vom Client oder der Öffentlichkeit sichtbaren API-Auswirkungen.
Implementieren Sie Folgendes für Ihre Erweiterungsbibliotheken, um einen anbieterspezifischen Sitzungstyp auszuwählen:
* ExtenderStateListener.onSessionType()
für einfache Erweiterungen
* Camera2SessionConfigImpl.getSessionType()
für erweiterte Erweiterungen
Versionsverlauf der Benutzeroberfläche für Erweiterungen
Die folgende Tabelle zeigt den Versionsverlauf der Benutzeroberfläche der Kameraerweiterung. Ich Die Anbieterbibliothek sollte immer mit der neuesten Version implementiert werden.
Version | Zusätzliche Funktionen |
---|---|
1.0.0 |
|
1.1.0 |
|
1.2.0 |
|
1.3.0 |
|
1.4.0 |
|
Referenzimplementierung
Die folgenden Referenzimplementierungen für OEM-Anbieterbibliotheken sind verfügbar in
frameworks/ex
advancedSample
: Eine einfache Implementierung des Advanced Extenders.sample
: Eine einfache Implementierung des Basic Extenders.service_based_sample
: Eine Implementierung, die zeigt, wie das Hosten Kameraerweiterungen in einemService
Diese Implementierung enthält die folgenden Komponenten:oem_library
: Eine Kamera-Erweiterungs-OEM-Bibliothek für Camera2- und CameraX-Erweiterungs-APIs dasExtensions-Interface
implementiert. Dies dient als Passthrough, leitet Anrufe vonExtensions-Interface
an den Dienst weiter. Diese Bibliothek bietet auch AIDL-Dateien und Wrapper-Klassen für die Kommunikation mit dem .Advanced Extender ist standardmäßig aktiviert. So aktivierst du den Basic Extender:
ExtensionsVersionImpl#isAdvancedExtenderImplemented
ändern, um zurückzukehrenfalse
.extensions_service
: Eine Beispielimplementierung des Erweiterungsdienstes. Implementierung hinzufügen hier. Die im Dienst zu implementierende Schnittstelle ist ähnlich zuExtensions-Interface
. Zum Beispiel ist die Implementierung derIAdvancedExtenderImpl.Stub
führt dieselben Vorgänge aus wieAdvancedExtenderImpl
.ImageWrapper
undTotalCaptureResultWrapper
sind erforderlich, umImage
undTotalCaptureResult
parzellell zu machen.
Anbieterbibliothek auf einem Gerät einrichten
Die OEM-Anbieterbibliothek ist nicht in eine App integriert. es wird vom Gerät geladen
zur Laufzeit von Camera2/X. In CameraX deklariert das Tag <uses-library>
dass die androidx.camera.extensions.impl
-Bibliothek, die im
AndroidManifest.xml
der camera-extensions
-Bibliothek ist eine Abhängigkeit von CameraX und muss
zur Laufzeit geladen werden. In Camera2 lädt das Framework einen Erweiterungsdienst,
deklariert außerdem, dass <uses-library>
androidx.camera.extensions.impl
während der Laufzeit.
Dadurch können Drittanbieter-Apps, die Erweiterungen verwenden, den OEM automatisch laden. Lieferantenbibliothek. Die OEM-Bibliothek ist als optional gekennzeichnet, damit Apps auf Geräten ausgeführt werden können. die die Bibliothek nicht auf dem Gerät haben. Camera2/X verarbeitet dieses Verhalten automatisch, wenn eine App versucht, eine Kamera zu verwenden. solange der Gerätehersteller die OEM-Bibliothek damit sie von der App gefunden werden kann.
So richten Sie die OEM-Bibliothek auf einem Gerät ein:
- Fügen Sie eine Berechtigungsdatei hinzu, die für das
<uses-library>
-Tag erforderlich ist. im folgenden Format:/etc/permissions/ANY_FILENAME.xml
. Für Beispiel:/etc/permissions/camera_extensions.xml
. Die Dateien in diesem eine Zuordnung der in<uses-library>
genannten Bibliothek zur Dateipfad auf dem Gerät. Verwenden Sie das Beispiel unten, um der Datei die erforderlichen Informationen hinzuzufügen.
- „
name
“ mussandroidx.camera.extensions.impl
sein. Das ist Bibliothek, nach der CameraX sucht. file
ist der absolute Pfad der Datei, die den Implementierung von Erweiterungen (z. B./system/framework/androidx.camera.extensions.impl.jar
).
<?xml version="1.0" encoding="utf-8"?> <permissions> <library name="androidx.camera.extensions.impl" file="OEM_IMPLEMENTED_JAR" /> </permissions>
- „
Geräte mit Android 12 oder höher, die CameraX unterstützen
Für Erweiterungen muss die Property ro.camerax.extensions.enabled
auf true
festgelegt sein.
mit der Sie abfragen können, ob ein Gerät Erweiterungen unterstützt.
Fügen Sie dazu die folgende Zeile in die Datei für die Gerätemarke ein:
PRODUCT_VENDOR_PROPERTIES += \
ro.camerax.extensions.enabled=true \
Zertifizierungsstufe
Um Ihre Implementierung der OEM-Anbieterbibliothek während der
Entwicklungsphase, verwenden Sie die Beispiel-App unter
androidx-main/camera/integration-tests/extensionstestapp/
,
die verschiedene Anbietererweiterungen umfasst.
Nachdem Sie die Implementierung abgeschlossen haben, verwenden Sie die Methode Validierungstool für Kameraerweiterungen mit automatischen und manuellen Tests überprüfen, ob die Anbieterbibliothek korrekt implementiert wurde.
Erweiterter Szenenmodus im Vergleich zu Kameraerweiterungen
Bei der Bokeh-Erweiterung können Sie
können Sie die Erweiterung im erweiterten Szenenmodus einblenden, der über
die
CONTROL_EXTENDED_SCENE_MODE
.
Weitere Informationen zur Implementierung finden Sie unter Kamera-Bokeh.
Der erweiterte Szenenmodus weist im Vergleich zu Kameraerweiterungen weniger Einschränkungen auf
Kamera2-Apps. Sie können beispielsweise den erweiterten Szenenmodus
eine reguläre CameraCaptureSession
-Instanz, die einen flexiblen Stream unterstützt
und Anfrageparameter erfassen. Kameraerweiterungen hingegen
nur eine feste Anzahl von Streamtypen und nur begrenzte Unterstützung für die
Anforderungsparameter.
Ein Nachteil des erweiterten Szenenmodus ist, dass Sie ihn nur in der Kamera-HAL. Das bedeutet, dass überprüft werden muss, dass sie auf allen orthogonale Steuerelemente für App-Entwickler.
Wir empfehlen, Bokeh-Effekte sowohl im erweiterten Szenenmodus als auch mit der Kamera aufzunehmen. Erweiterungen, da Apps möglicherweise eine bestimmte API bevorzugen, um Bokeh zu aktivieren. Wir empfehlen, zuerst den erweiterten Szenenmodus zu verwenden, da dies können Apps die Bokeh-Erweiterung flexibel aktivieren. Dann können Sie die auf der Oberfläche von Kameraerweiterungen basierend auf dem erweiterten Szenenmodus. Bei der Implementierung Bokeh in der Kamera-HAL ist schwierig, z. B. weil dafür ein Pfosten erforderlich ist. auf der App-Ebene ausgeführt wird, um Bilder zu verarbeiten, Bokeh-Erweiterung in der Benutzeroberfläche der Kameraerweiterungen an.
Häufig gestellte Fragen
Gibt es Einschränkungen für API-Ebenen?
Ja. Dies hängt vom Android API-Funktionssatz ab, der vom OEM gefordert wird.
Implementierung der Vendor Library. Beispiel:
ExtenderStateListener.onPresetSession()
verwendet die
SessionConfiguration.setSessionParameters()
-Aufruf zum Festlegen eines Basissatzes von Tags. Dieser Aufruf ist nur auf API-Ebene verfügbar
28 und höher. Weitere Informationen zu bestimmten Oberflächenmethoden finden Sie in der
API-Referenzdokumentation