Zu Camera2 migrieren

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:

  1. Wählen Sie einen dieser Modi aus:

  2. Um Streams zu konfigurieren, erstellen Sie eine Aufzeichnungssitzung mit den entsprechenden Ausgabeflächen. Beispiel: aus einem ImageReader oder SurfaceView mit CameraDevice.createCaptureSession() (Java) oder ACameraDevice_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.

  3. Verwenden Sie zum Schließen eines Kamerageräts CameraDevice.close() (Java) oder ACameraDevice_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:

  1. Starte das Streaming mit startVideoStream.
  2. Streaming beenden: stopVideoStream verwenden.

Camera2

Auf Camera2:

  1. Erstellen Sie eine CaptureRequest, die für die Vorschau geeignet ist, indem Sie TEMPLATE_PREVIEW mit CameraDevice.createCaptureRequest() in Java oder ACameraDevice_createCaptureRequest() im NDK verwenden.

  2. Senden Sie die Anfrage für das kontinuierliche Streaming mit CameraCaptureSession.setSingleRepeatingRequest (Java) oder ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Verwenden Sie zum Beenden des Streamings CameraCaptureSession.stopRepeating (Java) oder ACameraCaptureSession_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 oder ImageReader mit AImageReader_new oder ImageReader.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 dem Image-Objekt abgerufen wird, mit einer eindeutigen Kennung in Beziehung setzt.

Streaming pausieren und fortsetzen

  • EVS verwendet pauseVideoStream und resumeVideoStream.

  • Camera2 hat keine direkten Entsprechungen. Stattdessen:

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:

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 und forcePrimaryClient, 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:

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.