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_openCamera
im Native Development Kit (NDK).Im Modus für gemeinsame Nutzung verwenden Sie
openSharedCamera
oderACameraManager_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:
stopVideoStream
verwenden.
Camera2
Auf Camera2:
Erstellen Sie eine
CaptureRequest
, die für die Vorschau geeignet ist, indem SieTEMPLATE_PREVIEW
mitCameraDevice.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
setMaxFramesInFlight
gesteuert. 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
AImageReader
oderImageReader
mitAImageReader_new
oderImageReader.newInstance
festgelegt, 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
pauseVideoStream
undresumeVideoStream
.Camera2 hat keine direkten Entsprechungen. Stattdessen:
- Pausieren – verwende
stopRepeating
- Fortsetzen mit
setSingleRepeatingRequest
- Pausieren – verwende
Kameraparameter
EVS hat Methoden wie
setIntParameter
verwendet, 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
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 BerechtigungCAMERA
erforderlich. 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 CAMERA-Berechtigung.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,
setPrimaryClient
undforcePrimaryClient
, 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 im Vordergrund ausgeführte 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 die android.permission.SYSTEM_CAMERA
zusätzlich zur android.permission.CAMERA
haben, um eine Verbindung zu diesem Kameragerät herzustellen.
CarEVSManager und CarEVSService
Für den API-Zugriff sollten Java-Apps die Standard-android.hardware.camera2.CameraManager
anstelle von CarEVSManager
verwenden.
Für die Rückfahrkamera muss die Logik in CarEVSService
, die die VHAL-Property GEAR_SELECTION
überwacht und eine Aktivität startet, zu einer OEM-eigenen App migriert werden. Diese App:
- Überwacht das VHAL-Attribut
GEAR_SELECTION
. - Startet die Rückfahrkamera, wenn der Rückwärtsgang eingelegt wird.
- Verwendet Camera2‑APIs zum Anzeigen des Kamerafeeds.
Damit die Rückfahrkamera konsistent und ohne Unterbrechungen angezeigt wird, insbesondere bei Nutzerübergängen oder wenn andere Apps die Vorschau verdecken könnten, empfehlen wir die folgenden Richtlinien für die Implementierung der Rückfahrkamerafunktion mit Camera2:
Markieren Sie die Rückfahrkamera als Systemkamera.
Führen Sie den Dienst oder die App, die auf die Kamera zugreift, als
User 0
mit der BerechtigungCAMERA_HEADLESS_SYSTEM_USER
aus.Fügen Sie die App der Zulassungsliste für den Vertraulichkeitsmodus der Kamera hinzu.
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 verwenden, hardware/google/camera/devices/EmulatedCamera/
, die für Folgendes optimiert wird:
- 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.
Vorabzugriff auf die Kamera
Der Zugriff auf die EVS-Kamera war auf privilegierte Clients mit der AID_AUTOMOTIVE_EVS
-UID beschränkt. Für den Kamerazugriff, bevor der Android-Bootvorgang abgeschlossen ist, sofern die UID AID_AUTOMOTIVE_EVS
bleibt. Der frühe Kamerazugriff ist jedoch auf Systemkameras beschränkt, die sich außen am Fahrzeug befinden.
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. |