Auf dieser Seite werden die Unterschiede zwischen dem Extended View System (EVS) und Camera2 beschrieben. Außerdem wird beschrieben, wie Sie Ihre Camera2-Implementierung einrichten.
Kamera öffnen und schließen
EVS
openCamera kombiniert das Öffnen des Geräts und das Konfigurieren eines einzelnen Streams.
Camera2
So öffnen und schließen Sie ein Gerät mit Camera2:
Wählen Sie einen dieser Modi aus:
Im exklusiven Modus verwenden Sie
CameraManager.openCamera(Java) oderACameraManager_openCameraim Native Development Kit (NDK).Im Modus für gemeinsame Nutzung verwenden Sie
openSharedCameraoderACameraManager_openSharedCamera. Wenn Sie die Kamerafreigabe aktivieren, müssen Sie eine Konfiguration für die gemeinsame Sitzung angeben.
Um Streams zu konfigurieren, erstellen Sie eine Aufzeichnungssitzung mit den entsprechenden Ausgabeflächen. Beispiel: aus einem ImageReader oder SurfaceView mit
CameraDevice.createCaptureSession()(Java) oderACameraDevice_createCaptureSession()(NDK).Camera2 unterstützt mehrere gleichzeitige Streams. Erstellen Sie mehrere Streams für Zwecke wie Vorschau, Aufzeichnung und Bildverarbeitung. Streams dienen als parallele Pipelines, die Roh-Frames von der Kamera sequenziell verarbeiten.
Verwenden Sie zum Schließen eines Kamerageräts
CameraDevice.close()(Java) oderACameraDevice_close()(NDK).
Hier einige Beispielcode-Snippets:
Java
CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE);
try {
manager.openCamera(cameraId, new CameraDevice.StateCallback() {
@Override
public void onOpened(@NonNull CameraDevice camera) {
// Camera opened, now create session
}
@Override
public void onDisconnected(@NonNull CameraDevice camera) {}
@Override
public void onError(@NonNull CameraDevice camera, int error) {}
}, handler);
} catch (CameraAccessException e) {
// Handle exception
}
NDK
ACameraManager *cameraManager = ACameraManager_create();
ACameraDevice *cameraDevice = nullptr;
camera_status_t status = ACameraManager_openCamera(
cameraManager, cameraId, &deviceStateCallbacks, &cameraDevice);
Kameradaten streamen
In diesem Abschnitt wird beschrieben, wie Sie Kameradaten streamen.
EVS
Bei EVS:
- Starte das Streaming mit
startVideoStream. - Streaming beenden:
stopVideoStreamverwenden.
Camera2
Auf Camera2:
Erstellen Sie eine
CaptureRequest, die für die Vorschau geeignet ist, indem SieTEMPLATE_PREVIEWmitCameraDevice.createCaptureRequest()in Java oderACameraDevice_createCaptureRequest()im NDK verwenden.Senden Sie die Anfrage für das kontinuierliche Streaming mit
CameraCaptureSession.setSingleRepeatingRequest(Java) oderACameraCaptureSession_setRepeatingRequestV2(NDK).Verwenden Sie zum Beenden des Streamings
CameraCaptureSession.stopRepeating(Java) oderACameraCaptureSession_stopRepeating(NDK).
Pufferverwaltung
Bei EVS wurde die Anzahl der Puffer bisher über
setMaxFramesInFlightgesteuert. Diese konnte während des Streams geändert werden. Als das Kamerastreaming begann, stellte EVS für jeden Frame eine Puffer-ID bereit, die der gleichen Hardwarepufferadresse im Speicher entsprach.Bei Camera2 wird die maximale Anzahl von Bildern für ein
AImageReaderoderImageReadermitAImageReader_newoderImageReader.newInstancefestgelegt, wenn eine Sitzung initialisiert wird. Diese Einstellung kann nach Beginn der Sitzung nicht mehr dynamisch geändert werden. Um eine Puffer-ID für jeden Frame zu erhalten, können Clients eine Zuordnung verwalten, die die Hardwarepufferadresse, die aus demImage-Objekt abgerufen wird, mit einer eindeutigen Kennung in Beziehung setzt.
Streaming pausieren und fortsetzen
EVS verwendet
pauseVideoStreamundresumeVideoStream.Für Camera2 gibt es keine direkten Entsprechungen. Stattdessen:
- Pausieren – verwende
stopRepeating - Fortsetzen mit
setSingleRepeatingRequest
- Pausieren – verwende
Kameraparameter
EVS hat Methoden wie
setIntParameterverwendet, um den Parameter für die Kameraaufnahmeanfrage zu ändern.Rufen Sie in Camera2 die set API für den
CaptureRequest-Builder auf, um Parameter zu ändern, und senden Sie sie dann.
Sehen Sie sich diese Codebeispiele an:
Java
CaptureRequest.Builder builder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
builder.set(CaptureRequest.CONTROL_EFFECT_MODE, CaptureRequest.CONTROL_EFFECT_MODE_MONO);
// Submit this request
NDK
ACaptureRequest_setEntry_i32(captureRequest, ACAMERA_CONTROL_EFFECT_MODE, 1, &effectMode);
Logische Kameras
EVS: Bei logischen Kameras wie Surround View hat der EVS Manager alle zugehörigen physischen Kameras geöffnet, die Videostreams gestartet und ein zusammenhängendes Array von Bildern bereitgestellt.
Camera2: Wenn ähnliche Funktionen mit Camera2 benötigt werden, müssen Apps logische Kameras verwalten. Dazu ist Folgendes erforderlich:
- Physische Unterkameras identifizieren, die einer logischen Kamera zugeordnet sind.
- Öffnen Sie jede erforderliche physische Kamera.
- Starte Streams auf jeder Kamera.
- Synchronisieren Sie die Frames bei Bedarf. Im Idealfall wird dies auf der HAL für die Synchronisierung auf Hardwareebene gehandhabt.
Wir stellen bestehenden EVS-Clients eine Kompatibilitätsbibliothek (Shim-Schicht) zur Verfügung, um die Umstellung zu erleichtern. Ziel ist es, die Camera2 APIs mit minimalen Codeänderungen zu unterstützen.
Berechtigungen
In diesem Abschnitt werden Änderungen an Berechtigungen beschrieben.
EVS
Der Zugriff ist auf privilegierte eindeutige Kennungen (UIDs) beschränkt. Beispiel: AID_AUTOMOTIVE_EVS. Zu den eingestellten Berechtigungen gehören android.car.permission.USE_CAR_EVS_CAMERA.
Camera2
Für Camera2 ist android.permission.CAMERA erforderlich. Sonderfälle:
android.permission.SYSTEM_CAMERA: Zum Zugriff auf Kameras, die in Drittanbieter-Apps ausgeblendet sind. Dafür ist auch die BerechtigungCAMERAerforderlich. Weitere Informationen zu Systemkamerasandroid.permission.CAMERA_HEADLESS_SYSTEM_USER: Ermöglicht den Zugriff vonUser 0, was für Dienste wie Rückfahrkameras, die bei Nutzerwechseln ausgeführt werden müssen, unerlässlich ist. Erfordert eine vorab gewährte Kameraberechtigung.android.permission.CAMERA_PRIVACY_ALLOWLIST: Ermöglicht OEMs, bestimmte sicherheitskritische Apps von der vom Nutzer gesteuerten Datenschutzeinstellung für die Kamera auszunehmen.
Sicherheitskritische Kamera-Apps müssen die in Design for Driving beschriebenen Richtlinien für integrierte Apps von Google befolgen, die vor der Erteilung von Berechtigungen gelten.
Primäre und sekundäre Mandanten
So gewähren Sie Zugriff auf die Kamera:
EVS bot explizite APIs,
setPrimaryClientundforcePrimaryClient, zum Verwalten des primären Clients, der die Berechtigung zum Ändern von Parametern hatte.Camera2: Wenn die Kamera im freigegebenen Modus geöffnet wird (Android 16 und höher), bestimmt die Priorität des Clients, der auf die Kamera zugreift, den primären Client. Der Client mit der höchsten Priorität (in der Regel die Vordergrund-App) kann die Parameter der Erfassungsanfrage ändern. Es werden keine direkten APIs verwendet, um den primären Status zu erzwingen. Der primäre Status wird vom Framework verwaltet.
Systemkameras
Wenn der Zugriff auf ein Kameragerät nur auf System- oder 1P-Apps beschränkt werden soll, deklarieren Sie die Funktion ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA in der Camera HAL für dieses Gerät. Clients müssen zusätzlich zu android.permission.CAMERA auch android.permission.SYSTEM_CAMERA mit diesem Kameragerät verbunden haben.
Rückfahrkamera
EVS
EVS hat zuvor den Kamerazugriff vor dem Android-Boot ermöglicht, einem kritischen Ereignis für Funktionen wie Rückfahrkameras. Fahrzeug-OEMs sind für die Einhaltung und Zertifizierung der in Federal Motor Vehicle Safety Standard (FMVSS), No. 111 Rear Visibility (Bundesnorm für die Sicherheit von Kraftfahrzeugen, Nr. 111 – Sicht nach hinten) festgelegten Vorschriften verantwortlich. Außerdem müssen Fahrzeughersteller andere Vorschriften für Rückfahrkameras einhalten.
Die Konformität hängt von der Hardware, der HAL-Implementierung und der allgemeinen Systemintegration ab. Nach dem Booten der Referenzplattform unter Android benötigt EVS in der Regel vier bis sechs Sekunden, bis es betriebsbereit ist und Kamerazugriff gewährt.
Camera2
Ein privilegierter Client, der durch AID_AUTOMOTIVE_EVS UID identifiziert wird, kann Camera2-APIs für den Kamerazugriff verwenden, bevor der Android-Bootvorgang abgeschlossen ist. Dieser frühe Zugriff ist auf Systemkameras an der Außenseite des Fahrzeugs beschränkt. Camera2 erfüllt dieselben Leistungs-KPIs für den frühen Kamerazugriff wie EVS, das normalerweise innerhalb von vier bis sechs Sekunden nach dem Android-Boot verfügbar ist.
Damit die Rückfahrkamera konsistent und ohne Unterbrechungen angezeigt wird, insbesondere bei Nutzerübergängen oder wenn andere Apps die Vorschau verdecken, empfehlen wir die folgenden Richtlinien für die Implementierung der Rückfahrkamera mit Camera2:
Weisen Sie die Rückfahrkamera als Systemkamera zu, um den Zugriff durch Drittanbieter-Apps einzuschränken.
Führen Sie den Dienst oder die App, die auf die Kamera zugreift, als
User 0aus, um die Berechtigung CAMERA_HEADLESS_SYSTEM_USER zu verwenden. So wird ein unterbrechungsfreies Kamerastreaming gewährleistet, unabhängig davon, welcher Nutzer im Vordergrund aktiv ist.Fügen Sie die App der Zulassungsliste für den Vertraulichkeitsmodus der Kamera hinzu, um den Kamerazugriff zu gewähren, auch wenn die vom Nutzer gesteuerte Ein/Aus-Schaltfläche für den Vertraulichkeitsmodus der Kamera aktiviert ist.
CarEVSManager und CarEVSService
CarEVSManager hat Java-Apps zuvor Kamerazugriff gewährt. Durch die Umstellung auf Camera2 wird diese Funktion durch standard android.hardware.camera2.CameraManager ersetzt.
Wir planen, CarEVSService einzustellen. Dieser optionale Dienst überwacht die Property GEAR_SELECTION VHAL und wird verwendet, um eine vom OEM angegebene Rückfahrkamera-Aktivität zu starten. OEMs, die diese Funktion verwenden, müssen die zugehörige Logik in eine OEM-eigene App übertragen.
- Behalten Sie das Attribut
GEAR_SELECTION VHALim Blick. - Aktivieren Sie die Rückfahrkamera, wenn der Rückwärtsgang eingelegt wird.
- Verwenden Sie Camera2-APIs, um den Kamerafeed anzuzeigen.
Display-Rendering
EVS-Display und Automotive Display Service
Diese sind veraltet.
Camera2
Verwenden Sie die Standard-Android-Rendering-Methoden mit Surface, android.hardware.display.DisplayManager und android.view.Display.
In Szenarien, in denen die Kameraanzeige frühzeitig benötigt wird, kann der Camera2 ImageReader direkten Zugriff auf den Hardwarepuffer bieten, sodass Sie ihn in vorhandene DRM-basierte Display-Implementierungen für das Rendern einbinden können.
Dieser frühe Kamerazugriff ist ausschließlich privilegierten Clients mit der Berechtigung AID_AUTOMOTIVE_EVS_UID gestattet und auf Systemkameras beschränkt, die sich an der Außenseite eines Fahrzeugs befinden.
Emulator-HAL (EVS-Mock-HAL)
Wir planen, das EVS Mock HAL einzustellen. Stattdessen sollten OEMs die emulierte Camera2-HAL hardware/google/camera/devices/EmulatedCamera/ verwenden, für die wir Folgendes unterstützen möchten:
- Konfigurierbare Anzahl von Kameras.
- Farbbalken-Testmuster
- Emulation von Videodateien
So fügen Sie dieses HAL in den Build ein:
# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal
Außerdem sind geeignete Security-Enhanced Linux-Richtlinien (SELinux) erforderlich, damit cameraserver mit dem Emulated Camera HAL-Dienst interagieren kann.
V4L2-UVC-Kamera-HAL
Wir planen, das EVS V4L2 HAL einzustellen. Verwenden Sie die Unterstützung für externe Kameras von Camera2 für USB-Kameras (UVC). Weitere Informationen finden Sie unter Externe USB-Kameras.
Ultraschall-APIs
Wir planen, die EVS Ultrasonics APIs einzustellen. Verwenden Sie stattdessen diese in Android 15 eingeführten VHAL-Eigenschaften für die Erkennung von Ultraschallsensoren.
| Attribut | Eingeben | Definition |
|---|---|---|
ULTRASONICS_SENSOR_POSITION |
Statisch | {<x>, <y>, <z>}
Jeder Wert gibt die Position des Sensors entlang der zugehörigen Achse relativ zum AAOS-Sensorkoordinatensystem in Millimetern an. |
ULTRASONICS_SENSOR_ORIENTATION |
Statisch | {<qw>, <qx>, <qy>, <qz>}
Dies ist die Quaternion-Drehung des Sensors relativ zum AAOS-Sensorkoordinatensystem: $$w+xi+yj+zk$$ |
ULTRASONICS_SENSOR_FIELD_OF_VIEW |
Statisch | {<horizontal>, <vertical>}
Das horizontale und vertikale Sichtfeld des Sensors in Grad. |
ULTRASONICS_SENSOR_DETECTION_RANGE |
Statisch | {<minimum>, <maximum>}
Die Reichweite des Sensors in Millimetern. |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Statisch | {<range_min_1>, <range_max_1>, <range_min_2>,
<range_max_2>}
Ein Array der unterstützten Erfassungsbereiche des Sensors in Millimetern. |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Kontinuierlich | {<distance>, <distance_error>}
Die vom Sensor gemessene Entfernung und der Entfernungsfehler in Millimetern. Wenn nur ein Bereich unterstützt wird, ist dies der Mindestabstand im erkannten Bereich. |