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. I flussi 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. Crea 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 utilizzando 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

Questa sezione descrive le modifiche alle 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 avere android.permission.SYSTEM_CAMERA, oltre a android.permission.CAMERA collegato a questo dispositivo videocamera.

Telecamera posteriore

EVS

In precedenza, EVS abilitava l'accesso alla videocamera prima dell'avvio di Android, un evento fondamentale per funzionalità come le videocamere posteriori. I produttori di apparecchiature originali (OEM) per veicoli sono responsabili della conformità e della certificazione ai sensi dei regolamenti forniti dallo standard federale per la sicurezza dei veicoli a motore (FMVSS), n. 111, visibilità posteriore. Inoltre, gli OEM dei veicoli devono rispettare altre normative relative alle telecamere posteriori.

La conformità dipende dall'hardware, dall'implementazione HAL e dall'integrazione complessiva del sistema. Dopo l'avvio di Android della piattaforma di riferimento, in genere EVS impiega 4-6 secondi per diventare operativo e concedere l'accesso alla videocamera.

Camera2

Un client privilegiato, identificato da AID_AUTOMOTIVE_EVS UID, può utilizzare le API Camera2 per l'accesso alla fotocamera prima del completamento della procedura di avvio di Android. Questo accesso anticipato è limitato alle videocamere di sistema all'esterno del veicolo. Camera2 soddisfa gli stessi KPI di rendimento per l'accesso anticipato alla videocamera di EVS, che in genere diventa disponibile entro 4-6 secondi dall'avvio di Android.

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 di seguire queste linee guida quando implementi la videocamera posteriore con Camera2:

  1. Designa la videocamera posteriore come videocamera di sistema per limitare l'accesso delle app di terze parti.

  2. Esegui il servizio o l'app che accede alla fotocamera come User 0 per utilizzare l'autorizzazione CAMERA_HEADLESS_SYSTEM_USER. In questo modo, lo streaming della videocamera non viene interrotto, indipendentemente dal cambio di utente in primo piano.

  3. Aggiungi l'app all'elenco consentito per la privacy della fotocamera per concedere l'accesso alla fotocamera anche quando l'opzione di attivazione/disattivazione della privacy della fotocamera controllata dall'utente è abilitata.

CarEVSManager e CarEVSService

In precedenza, CarEVSManager forniva alle app Java l'accesso alla videocamera. Il passaggio a Camera2 sostituisce questa funzionalità con standard android.hardware.camera2.CameraManager.

Prevediamo di ritirare CarEVSService, un servizio facoltativo che monitora la proprietà GEAR_SELECTION VHAL e che veniva utilizzato per avviare un'attività della videocamera posteriore specificata dal produttore OEM. Gli OEM che utilizzano questa funzionalità devono trasferire la logica associata a un'app di proprietà dell'OEM.

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

Rendering del display

Servizio di visualizzazione EVS e display per auto

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. Gli OEM devono invece utilizzare l'HAL della videocamera emulata Camera2, hardware/google/camera/devices/EmulatedCamera/, in cui prevediamo di supportare:

  • Numero configurabile di videocamere.
  • Pattern di test delle 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

Abbiamo in programma 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.

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>}

Quale 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.