Esegui la migrazione a Camera2

Questa pagina identifica le differenze tra l'Extended View System (EVS) e Camera2. Descrive anche come configurare l'implementazione di Camera2.

Aprire e chiudere la videocamera

EVS

openCamera combina l'apertura del dispositivo e la configurazione di un singolo stream.

Camera2

Per aprire e chiudere un dispositivo con Camera2:

  1. Seleziona una di queste modalità:

  2. Per configurare gli stream, crea una sessione di acquisizione con le superfici di output pertinenti. Ad esempio, da un ImageReader o SurfaceView con CameraDevice.createCaptureSession() (Java) o ACameraDevice_createCaptureSession() (NDK).

    Camera2 supporta più stream simultanei. Crea più stream per scopi quali anteprima, registrazione ed elaborazione delle immagini. Gli stream fungono da pipeline parallele, elaborando in sequenza i frame non elaborati della videocamera.

  3. Per chiudere un dispositivo videocamera, utilizza CameraDevice.close() (Java) o ACameraDevice_close() (NDK).

Prendi in considerazione questi snippet di codice di esempio:

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);

Trasmettere in streaming i dati della videocamera

Questa sezione descrive come trasmettere in streaming i dati della videocamera.

EVS

Su EVS, per:

  1. Per avviare lo streaming, utilizza startVideoStream.
  2. Interrompi lo streaming, utilizza stopVideoStream.

Camera2

Su Camera2, per:

  1. Per creare un CaptureRequest adatto all'anteprima, utilizza TEMPLATE_PREVIEW con CameraDevice.createCaptureRequest() in Java o ACameraDevice_createCaptureRequest() nell'NDK.

  2. Invia la richiesta di streaming continuo, utilizza CameraCaptureSession.setSingleRepeatingRequest (Java) o ACameraCaptureSession_setRepeatingRequestV2 (NDK).

  3. Interrompi lo streaming, utilizza CameraCaptureSession.stopRepeating (Java) o ACameraCaptureSession_stopRepeating (NDK).

Gestione del buffer

  • Su EVS, setMaxFramesInFlight controllava in precedenza il conteggio dei buffer, che poteva essere modificato a metà flusso. Quando è iniziato lo streaming della videocamera, EVS ha fornito un ID buffer per ogni frame dell'immagine, che corrispondeva allo stesso indirizzo del buffer hardware in memoria.

  • Su Camera2, il numero massimo di immagini per un AImageReader o ImageReader viene impostato con AImageReader_new o ImageReader.newInstance quando viene inizializzata una sessione. Questo valore non può essere modificato dinamicamente una volta avviata la sessione. Per ottenere un ID buffer per ogni frame, i client possono gestire una mappa che correla l'indirizzo del buffer hardware, ottenuto dall'oggetto Image, a un identificatore univoco.

Mettere in pausa e riprendere lo streaming

Parametri della videocamera

  • EVS ha utilizzato metodi, ad esempio setIntParameter, per modificare il parametro della richiesta di acquisizione della videocamera.

  • Su Camera2, per modificare i parametri, chiama l'API set per il generatore CaptureRequest e poi invialo.

Considera questi esempi di codice:

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);

Videocamere logiche

  • EVS: per le videocamere logiche, come la visione a 360°, EVS Manager ha aperto tutte le videocamere fisiche associate, ha avviato gli stream video e ha fornito un array coeso di immagini.

  • Camera2: quando è necessaria una funzionalità simile con Camera2, le app devono gestire le videocamere logiche, il che richiede di:

    • Identifica le fotocamere secondarie fisiche associate a una fotocamera logica.
    • Apri ogni videocamera fisica necessaria.
    • Avvia i flussi su ogni videocamera.
    • Se necessario, sincronizza i fotogrammi. Idealmente, questa operazione viene gestita a livello di HAL per la sincronizzazione a livello hardware.

Forniremo una libreria di compatibilità (livello shim) ai clienti EVS esistenti per facilitare la transizione. L'obiettivo è supportare le API Camera2 con modifiche minime al codice.

Autorizzazioni

EVS

L'accesso è limitato a identificatori univoci (UID) con privilegi. Ad esempio, AID_AUTOMOTIVE_EVS. Le autorizzazioni ritirate includono android.car.permission.USE_CAR_EVS_CAMERA.

Camera2

Camera2 richiede android.permission.CAMERA. Per i casi speciali:

Le app per videocamere critiche per la sicurezza devono rispettare le norme pre-concessione integrate di Google fornite in Design for Driving.

Clienti principali e secondari

Per l'accesso condiviso alla videocamera:

  • EVS offriva API esplicite, setPrimaryClient e forcePrimaryClient, per gestire il client principale, che aveva l'autorità per modificare i parametri.

  • Camera2, quando la fotocamera viene aperta in modalità condivisa (Android 16 e versioni successive), la priorità del client che accede alla fotocamera determina il client principale. Il client con la priorità più alta (in genere l'app in primo piano) può modificare i parametri della richiesta di acquisizione. Non vengono utilizzate API dirette per forzare lo stato principale. Lo stato principale è gestito dal framework.

Videocamere di sistema

Per limitare l'accesso a un dispositivo videocamera alle app di sistema o proprietarie soltanto, dichiara la funzionalità ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA nella HAL della videocamera per quel dispositivo. I client devono disporre di android.permission.SYSTEM_CAMERA oltre a android.permission.CAMERA per connettersi a questo dispositivo videocamera.

CarEVSManager e CarEVSService

Per l'accesso all'API, le app Java devono utilizzare android.hardware.camera2.CameraManager standard anziché CarEVSManager.

Per la videocamera posteriore, la logica in CarEVSService che monitora la proprietà VHAL GEAR_SELECTION e avvia un'attività deve essere migrata a un'app di proprietà dell'OEM. Questa app:

  • Monitora la proprietà VHAL GEAR_SELECTION.
  • Avvia l'attività della videocamera posteriore quando viene inserita la retromarcia.
  • Utilizza le API Camera2 per visualizzare il feed della videocamera.

Per una visualizzazione coerente e senza ostacoli della videocamera posteriore, in particolare durante le transizioni dell'utente o quando altre app potrebbero oscurare l'anteprima, ti consigliamo queste linee guida quando implementi la funzionalità della videocamera posteriore con Camera2:

Rendering del display

Servizio di visualizzazione EVS e di visualizzazione per il settore automobilistico.

Questi sono deprecati.

Camera2

Utilizza i metodi di rendering standard di Android con Surface, android.hardware.display.DisplayManager e android.view.Display.

Per gli scenari che richiedono la visualizzazione anticipata della videocamera, ImageReader di Camera2 può fornire l'accesso diretto al buffer hardware, in modo da poterlo integrare con le implementazioni di visualizzazione basate su DRM esistenti per il rendering.

Questo accesso anticipato alla videocamera è consentito esclusivamente ai client privilegiati che dispongono di AID_AUTOMOTIVE_EVS_UID ed è limitato alle videocamere di sistema situate all'esterno di un veicolo.

Emulator HAL (EVS mock HAL)

Abbiamo in programma di ritirare EVS Mock HAL. I produttori OEM devono invece utilizzare l'HAL della fotocamera emulata Camera2, hardware/google/camera/devices/EmulatedCamera/, che verrà migliorato per supportare:

  • Numero configurabile di videocamere.
  • Pattern di test barre colore.
  • Emulazione di file video.

Per includere questo HAL nella build:

# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal

Sono necessarie anche policy Security-Enhanced Linux (SELinux) appropriate per consentire a cameraserver di interagire con il servizio Emulated Camera HAL.

HAL della videocamera UVC V4L2

Prevediamo di ritirare EVS V4L2 HAL. Utilizza il supporto della videocamera esterna Camera2 per le videocamere USB (UVC). Per saperne di più, vedi Videocamere USB esterne.

Accesso anticipato alla fotocamera

L'accesso alla videocamera EVS era limitato ai client privilegiati con l'UID AID_AUTOMOTIVE_EVS. Per l'accesso alla videocamera prima del completamento della procedura di avvio di Android, a condizione che l'UID rimanga AID_AUTOMOTIVE_EVS. Tuttavia, l'accesso anticipato alla videocamera è limitato alle videocamere di sistema situate all'esterno del veicolo.

API per gli ultrasuoni

Abbiamo in programma di ritirare le API EVS Ultrasonics. Utilizza invece queste proprietà VHAL introdotte in Android 15 per i rilevamenti dei sensori ultrasonici.

Proprietà Tipo Definizione
ULTRASONICS_SENSOR_POSITION Statico {<x>, <y>, <z>}

In millimetri, ogni valore rappresenta la posizione del sensore lungo l'asse associato rispetto al sistema di coordinate del sensore AAOS.

ULTRASONICS_SENSOR_ORIENTATION Statico {<qw>, <qx>, <qy>, <qz>}

Qual è questa rotazione quaternione del sensore rispetto al sistema di coordinate del sensore AAOS: $$w+xi+yj+zk$$

ULTRASONICS_SENSOR_FIELD_OF_VIEW Statico {<horizontal>, <vertical>}

In gradi, il campo visivo orizzontale e verticale del sensore.

ULTRASONICS_SENSOR_DETECTION_RANGE Statico {<minimum>, <maximum>}

In millimetri, il raggio di rilevamento del sensore.

ULTRASONICS_SENSOR_DETECTION_RANGES Statico {<range_min_1>, <range_max_1>, <range_min_2>, <range_max_2>}

In millimetri, inclusivo, un array degli intervalli di rilevamento supportati dal sensore.

ULTRASONICS_SENSOR_DETECTION_RANGES Continuo {<distance>, <distance_error>}

In millimetri, la distanza misurata dal sensore e l'errore di distanza. Se è supportato solo un intervallo, questa è la distanza minima nell'intervallo rilevato.