Cette page identifie les différences entre le système de vue étendue (EVS) et Camera2. Elle explique également comment configurer votre implémentation Camera2.
Ouvrir et fermer la caméra
EVS
openCamera
combine l'ouverture de l'appareil et la configuration d'un seul flux.
Camera2
Pour ouvrir et fermer un appareil avec Camera2 :
Sélectionnez l'un des modes suivants :
En mode exclusif, utilisez
CameraManager.openCamera
(Java) ouACameraManager_openCamera
sur le kit de développement natif (NDK).En mode partagé, utilisez
openSharedCamera
ouACameraManager_openSharedCamera
. Lorsque vous activez le partage de la caméra, fournissez une configuration de session partagée.
Pour configurer les flux, créez une session de capture avec les surfaces de sortie appropriées. Par exemple, à partir d'un ImageReader ou d'une SurfaceView avec
CameraDevice.createCaptureSession()
(Java) ouACameraDevice_createCaptureSession()
(NDK).Camera2 est compatible avec les flux multiples simultanés. Créez plusieurs flux pour des besoins tels que l'aperçu, l'enregistrement et le traitement d'images. Les flux servent de pipelines parallèles, qui traitent séquentiellement les trames brutes de la caméra.
Pour fermer un appareil photo, utilisez
CameraDevice.close()
(Java) ouACameraDevice_close()
(NDK).
Considérez ces exemples d'extraits de code :
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);
Diffuser les données de la caméra
Cette section explique comment diffuser des données de caméras.
EVS
Sur EVS, pour :
- Lancez le streaming à l'aide de
startVideoStream
. - Pour arrêter la diffusion, utilisez
stopVideoStream
.
Camera2
Dans Camera2, pour :
Créez un
CaptureRequest
adapté à l'aperçu, utilisezTEMPLATE_PREVIEW
avecCameraDevice.createCaptureRequest()
en Java ouACameraDevice_createCaptureRequest()
sur le NDK.Pour envoyer une requête de streaming continu, utilisez
CameraCaptureSession.setSingleRepeatingRequest
(Java) ouACameraCaptureSession_setRepeatingRequestV2
(NDK).Pour arrêter le streaming, utilisez
CameraCaptureSession.stopRepeating
(Java) ouACameraCaptureSession_stopRepeating
(NDK).
Gestion du tampon
Sur EVS,
setMaxFramesInFlight
contrôlait auparavant le nombre de tampons, qui pouvait potentiellement être modifié en cours de flux. Lorsque le flux de caméras a démarré, EVS a fourni un ID de tampon pour chaque image, qui correspondait à la même adresse de tampon matériel en mémoire.Sur Camera2, le nombre maximal d'images pour un
AImageReader
ou unImageReader
est défini avecAImageReader_new
ouImageReader.newInstance
lorsqu'une session est initialisée. Ce paramètre ne peut pas être modifié de manière dynamique une fois la session démarrée. Pour obtenir un ID de tampon pour chaque frame, les clients peuvent conserver un mappage qui met en corrélation l'adresse du tampon matériel, obtenue à partir de l'objetImage
, avec un identifiant unique.
Mettre en pause et reprendre la diffusion
EVS utilisé
pauseVideoStream
etresumeVideoStream
.Camera2 n'a pas d'équivalent direct. Au lieu de :
- Mettre en pause, utiliser
stopRepeating
- Reprendre, utiliser
setSingleRepeatingRequest
- Mettre en pause, utiliser
Paramètres de la caméra
EVS a utilisé des méthodes telles que
setIntParameter
pour modifier le paramètre de requête de capture de la caméra.Sur Camera2, pour modifier les paramètres, appelez l'API set pour le compilateur
CaptureRequest
, puis envoyez-le.
Considérez ces exemples de code :
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);
Caméras logiques
EVS : pour les caméras logiques, telles que la caméra de vision panoramique, le gestionnaire EVS ouvrait toutes les caméras physiques associées, lançait les flux vidéo et fournissait un ensemble cohérent d'images.
Camera2 : lorsque des fonctionnalités similaires sont nécessaires avec Camera2, les applications doivent gérer les caméras logiques, ce qui vous oblige à :
- Identifiez les sous-caméras physiques associées à une caméra logique.
- Ouvrez chaque caméra physique nécessaire.
- Lancez les flux sur chaque caméra.
- Synchronisez les images, si nécessaire. Idéalement, cette opération est gérée au niveau de la HAL pour la synchronisation matérielle.
Nous fournirons une bibliothèque de compatibilité (couche shim) aux clients EVS existants pour faciliter la transition. L'objectif est de prendre en charge les API Camera2 avec un minimum de modifications du code.
Autorisations
EVS
L'accès est limité aux identifiants uniques (UID) privilégiés. Par exemple, AID_AUTOMOTIVE_EVS
. Les autorisations obsolètes incluent android.car.permission.USE_CAR_EVS_CAMERA
.
Camera2
Camera2 nécessite android.permission.CAMERA
. Pour les cas particuliers :
android.permission.SYSTEM_CAMERA
: pour accéder aux caméras masquées dans les applications tierces. Nécessite également l'autorisationCAMERA
. Pour en savoir plus, consultez Caméras système.android.permission.CAMERA_HEADLESS_SYSTEM_USER
: permet d'accéder àUser 0
, ce qui est essentiel pour les services tels que les caméras de recul qui doivent fonctionner lors du changement d'utilisateur. Nécessite une autorisation CAMERA accordée au préalable.android.permission.CAMERA_PRIVACY_ALLOWLIST
: permet aux OEM d'exempter certaines applications critiques pour la sécurité du bouton bascule de confidentialité de l'appareil photo contrôlé par l'utilisateur.
Les applications de caméras critiques pour la sécurité doivent respecter les règles Google intégrées avant l'octroi d'autorisations fournies dans Concevoir pour la conduite.
Clients principaux et secondaires
Pour l'accès partagé à la caméra :
EVS proposait des API explicites,
setPrimaryClient
etforcePrimaryClient
, pour gérer le client principal, qui était autorisé à modifier les paramètres.Avec Camera2, lorsque l'appareil photo est ouvert en mode partagé (Android 16 et versions ultérieures), la priorité du client accédant à l'appareil photo détermine le client principal. Le client ayant la priorité la plus élevée (généralement l'application au premier plan) peut modifier les paramètres de la requête de capture. Aucune API directe n'est utilisée pour forcer l'état principal. L'état principal est géré par le framework.
Caméras système
Pour restreindre l'accès à un appareil photo aux applications système ou propriétaires uniquement, déclarez la fonctionnalité ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SYSTEM_CAMERA
dans le HAL de l'appareil photo pour cet appareil. Les clients doivent disposer du rôle android.permission.SYSTEM_CAMERA
en plus du rôle android.permission.CAMERA
pour se connecter à cette caméra.
CarEVSManager et CarEVSService
Pour accéder à l'API, les applications Java doivent utiliser l'API android.hardware.camera2.CameraManager
standard au lieu de CarEVSManager
.
Pour la caméra de recul, la logique de CarEVSService
qui surveille la propriété VHAL GEAR_SELECTION
et lance une activité doit être migrée vers une application appartenant à l'OEM. Cette application :
- Surveille la propriété VHAL
GEAR_SELECTION
. - Lance l'activité de la caméra de recul lorsque la marche arrière est enclenchée.
- Utilise les API Camera2 pour afficher le flux de l'appareil photo.
Pour un affichage cohérent et non obstrué de la caméra de recul, en particulier lors des transitions utilisateur ou lorsque d'autres applications peuvent masquer l'aperçu, nous vous recommandons de suivre ces consignes lors de l'implémentation de la fonctionnalité de caméra de recul avec Camera2 :
Marquez la caméra de recul comme caméra système.
Exécutez le service ou l'application accédant à l'appareil photo en tant que
User 0
à l'aide de l'autorisationCAMERA_HEADLESS_SYSTEM_USER
.Ajoutez l'application à la liste d'autorisation de confidentialité de la caméra.
Rendu de l'écran
Service d'affichage EVS et service d'affichage automobile.
Ces états sont obsolètes.
Camera2
Utilisez les méthodes de rendu Android standards avec Surface, android.hardware.display.DisplayManager
et android.view.Display
.
Pour les scénarios nécessitant un affichage précoce de la caméra, ImageReader Camera2 peut fournir un accès direct au tampon matériel afin que vous puissiez l'intégrer aux implémentations d'affichage existantes basées sur DRM pour le rendu.
Cet accès anticipé à la caméra est exclusivement autorisé pour les clients privilégiés qui disposent de AID_AUTOMOTIVE_EVS_UID
et est limité aux caméras système situées à l'extérieur d'un véhicule.
HAL de l'émulateur (HAL de simulation EVS)
Nous prévoyons d'abandonner EVS Mock HAL. Les OEM doivent plutôt utiliser le HAL de l'appareil photo émulé Camera2, hardware/google/camera/devices/EmulatedCamera/
, qui sera amélioré pour prendre en charge :
- Nombre de caméras configurable.
- Barres de couleur de test
- Émulation de fichiers vidéo.
Pour inclure ce HAL dans la compilation :
# In device.mk
PRODUCT_SOONG_NAMESPACES += hardware/google/camera/devices/EmulatedCamera
PRODUCT_PACKAGES += com.google.emulated.camera.provider.hal
Des règles SELinux (Security-Enhanced Linux) appropriées sont également requises pour permettre à cameraserver
d'interagir avec le service HAL de la caméra émulée.
HAL de la caméra V4L2 UVC
Nous prévoyons d'abandonner EVS V4L2 HAL. Utilisez la compatibilité des appareils photo externes Camera2 pour les caméras USB (UVC). Pour en savoir plus, consultez Appareils photo USB externes.
Accès anticipé à l'appareil photo
L'accès à la caméra EVS était limité aux clients privilégiés disposant de l'UID AID_AUTOMOTIVE_EVS
. Pour l'accès à la caméra avant la fin du processus de démarrage d'Android, à condition que l'UID reste AID_AUTOMOTIVE_EVS
. Toutefois, l'accès anticipé à la caméra est limité aux caméras système situées à l'extérieur du véhicule.
API Ultrasonics
Nous prévoyons d'abandonner les API EVS Ultrasonics. Utilisez plutôt ces propriétés VHAL introduites dans Android 15 pour les détections de capteurs à ultrasons.
Propriété | Saisie | Définition |
---|---|---|
ULTRASONICS_SENSOR_POSITION |
Statique | {<x>, <y>, <z>}
En millimètres, chaque valeur représente la position du capteur le long de l'axe associé par rapport au repère de coordonnées du capteur AAOS. |
ULTRASONICS_SENSOR_ORIENTATION |
Statique | {<qw>, <qx>, <qy>, <qz>}
Il s'agit de la rotation du capteur par rapport au repère de coordonnées du capteur AAOS : $$w+xi+yj+zk$$ |
ULTRASONICS_SENSOR_FIELD_OF_VIEW |
Statique | {<horizontal>, <vertical>}
Champ de vision horizontal et vertical du capteur, en degrés. |
ULTRASONICS_SENSOR_DETECTION_RANGE |
Statique | {<minimum>, <maximum>}
Plage de détection du capteur, en millimètres. |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Statique | {<range_min_1>, <range_max_1>, <range_min_2>,
<range_max_2>}
Tableau des plages de détection prises en charge par le capteur (en millimètres, inclus). |
ULTRASONICS_SENSOR_DETECTION_RANGES |
Continu | {<distance>, <distance_error>}
Distance mesurée par le capteur et erreur de distance, en millimètres. Si seule une plage est acceptée, il s'agit de la distance minimale de la plage détectée. |