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:
Seleziona una di queste modalità:
Modalità esclusiva, utilizza
CameraManager.openCamera
(Java) oACameraManager_openCamera
sul Native Development Kit (NDK).Modalità condivisione, utilizza
openSharedCamera
oACameraManager_openSharedCamera
. Quando attivi la condivisione della videocamera, fornisci una configurazione della sessione condivisa.
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) oACameraDevice_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.
Per chiudere un dispositivo videocamera, utilizza
CameraDevice.close()
(Java) oACameraDevice_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:
- Per avviare lo streaming, utilizza
startVideoStream
. - Interrompi lo streaming, utilizza
stopVideoStream
.
Camera2
Su Camera2, per:
Per creare un
CaptureRequest
adatto all'anteprima, utilizzaTEMPLATE_PREVIEW
conCameraDevice.createCaptureRequest()
in Java oACameraDevice_createCaptureRequest()
nell'NDK.Invia la richiesta di streaming continuo, utilizza
CameraCaptureSession.setSingleRepeatingRequest
(Java) oACameraCaptureSession_setRepeatingRequestV2
(NDK).Interrompi lo streaming, utilizza
CameraCaptureSession.stopRepeating
(Java) oACameraCaptureSession_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
oImageReader
viene impostato conAImageReader_new
oImageReader.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'oggettoImage
, a un identificatore univoco.
Mettere in pausa e riprendere lo streaming
EVS ha utilizzato
pauseVideoStream
eresumeVideoStream
.Camera2 non ha equivalenti diretti. Invece, per:
- Metti in pausa, usa
stopRepeating
- Riprendi, usa
setSingleRepeatingRequest
- Metti in pausa, usa
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:
android.permission.SYSTEM_CAMERA
: per accedere alle videocamere nascoste dalle app di terze parti. Richiede anche l'autorizzazioneCAMERA
. Per scoprire di più, consulta Fotocamere di sistema.android.permission.CAMERA_HEADLESS_SYSTEM_USER
: consente l'accesso daUser 0
, fondamentale per servizi come le telecamere posteriori che devono funzionare con i cambi di utente. Richiede un'autorizzazione CAMERA pre-concessa.android.permission.CAMERA_PRIVACY_ALLOWLIST
: consente agli OEM di esonerare determinate app essenziali per la sicurezza dal toggle della privacy della fotocamera controllato dall'utente.
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
eforcePrimaryClient
, 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:
Contrassegna la videocamera posteriore come videocamera di sistema.
Esegui il servizio o l'app che accede alla videocamera come
User 0
utilizzando l'autorizzazioneCAMERA_HEADLESS_SYSTEM_USER
.Aggiungi l'app alla lista consentita per la privacy della fotocamera.
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. |