Vous pouvez autoriser plusieurs clients à accéder simultanément à une caméra. Pour ce faire, utilisez les API système Java et Android NDK décrites sur cette page pour partager l'accès aux clients de l'appareil photo système.
Client principal : client ayant la priorité la plus élevée parmi les clients partagés. Un client principal peut créer des demandes de capture et modifier les paramètres de capture.
Client secondaire : tous les autres clients partagés sont des clients secondaires. Les clients secondaires ne peuvent pas créer de demandes de capture ni modifier les paramètres de capture. Les clients secondaires ne peuvent envoyer des requêtes que pour démarrer ou arrêter le streaming.
Pour le streaming, le service de caméras utilise les paramètres de requête de capture par défaut pour le modèle d'aperçu. Si le client principal diffuse du contenu, le service utilise les paramètres de requête de capture spécifiés par le client principal.
Configurer une session partagée
Pour partager un appareil photo, fournissez la configuration de la session partagée dans le fichier nommé shared_session_config.xml situé dans /system_ext/etc/. Dans cet exemple de code, l'ID de caméra 0 est compatible avec le partage de caméras avec une configuration qui inclut deux flux, ImageReader et SurfaceView.
<SharedCameraSessionConfigurations colorSpace="-1">
<!-- colorSpace: ANDROID_REQUEST_AVAILABLE_COLOR_SPACE_PROFILES_MAP_UNSPECIFIED -->
<SharedCameraSessionConfiguration cameraId="0">
<!-- First OutputConfiguration: All optional fields are provided -->
<OutputConfiguration>
<!-- surfaceType: SURFACE_TYPE_IMAGE_READER -->
<surfaceType>4</surfaceType>
<width>1920</width>
<height>1080</height>
<!-- physicalCameraId is omitted; defaults to "" -->
<!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
<streamUseCase>0</streamUseCase>
<!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
<timestampBase>0</timestampBase>
<!-- mirrorMode: MIRROR_MODE_AUTO -->
<mirrorMode>0</mirrorMode>
<useReadoutTimestamp>0</useReadoutTimestamp>
<!-- format: HAL_PIXEL_FORMAT_RGBA_8888 -->
<format>1</format>
<!-- usage: AHARDWAREBUFFER_USAGE_CPU_READ_OFTEN -->
<usage>3</usage>
<!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
<dataSpace>0</dataSpace>
</OutputConfiguration>
<!-- Second OutputConfiguration: All optional fields are provided -->
<OutputConfiguration>
<!-- surfaceType: SURFACE_TYPE_SURFACE_VIEW -->
<surfaceType>0</surfaceType>
<width>1920</width>
<height>1080</height>
<!-- physicalCameraId is omitted; defaults to "" -->
<!-- streamUseCase: ANDROID_SCALER_AVAILABLE_STREAM_USE_CASES_DEFAULT -->
<streamUseCase>0</streamUseCase>
<!-- timestampBase: TIMESTAMP_BASE_DEFAULT -->
<timestampBase>0</timestampBase>
<!-- mirrorMode: MIRROR_MODE_AUTO -->
<mirrorMode>0</mirrorMode>
<useReadoutTimestamp>0</useReadoutTimestamp>
<!-- format: HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED -->
<format>34</format>
<!-- usage: AHARDWAREBUFFER_USAGE_GPU_SAMPLED_IMAGE|AHARDWAREBUFFER_USAGE_COMPOSER_OVERLAY -->
<usage>256|2048</usage>
<!-- dataSpace: HAL_DATASPACE_UNKNOWN -->
<dataSpace>0</dataSpace>
</OutputConfiguration>
</SharedCameraSessionConfiguration>
</SharedCameraSessionConfigurations>
Pour interroger une configuration de session partagée, les clients utilisent CameraCharacteristics pour SHARED_SESSION_CONFIGURATION. Les clients qui accèdent à une caméra en mode partagé doivent utiliser la configuration de session partagée. Lorsqu'une configuration de session transmise par un client ne correspond pas à la configuration de session partagée, un appel createCaptureSession échoue.
API Java
CameraManager et CameraDevice fournissent des API pour ouvrir les caméras en mode partagé.
API CameraManager
CameraManager fournit les API suivantes :
isCameraDeviceSharingSupported: les clients utilisent cette API pour déterminer si une caméra est compatible avec le mode partagé.openSharedCamera: si une caméra est compatible avec le mode partagé, les clients utilisent cette API pour ouvrir la caméra en mode partagé.
API CameraDevice.StateCallback
CameraDevice.StateCallback fournit les API suivantes :
onOpenedInSharedMode: les clients reçoivent ce rappel lorsque la caméra est ouverte en mode partagé. Le rappel indique si le client est le client principal ou secondaire.onClientSharedAccessPriorityChanged: lorsqu'une session partagée est ouverte, ce rappel est déclenché lorsque la priorité d'un client est modifiée, car un client de priorité plus élevée a ouvert ou fermé la même caméra.
CameraSharedCaptureSession
La classe CameraSharedCaptureSession représente une session de capture partagée.
En mode caméra partagée, un client qui crée une session doit utiliser le type de session SESSION_SHARED.
Lorsque le système crée une session, il caste CameraCaptureSession sur CameraSharedCaptureSession.
Les clients secondaires ne peuvent pas utiliser createCaptureRequest. Les clients secondaires utilisent plutôt l'API startStreaming pour démarrer la diffusion sur des surfaces spécifiées et l'API stopStreaming pour l'arrêter.
API Android NDK
Les applications intégrées utilisent ces API Android NDK pour ouvrir une caméra en mode partagé :
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Tester les caméras partagées
Consultez ces tests spécifiques aux caméras multiclients :
Suite de tests du fournisseur (VTS) : consultez
SharedCameraTestdansVtsAidlCameraServiceTargetTest.Suite de tests de compatibilité (CTS) : consultez
android.hardware.multiprocess.camera.cts.SharedCameraTestdansCtsCameraTestCases.
Restrictions
Le mode Caméra partagée n'est pas compatible avec les options suivantes :
- Requêtes de capture par rafale
- Sessions d'extension
- Sessions à haut débit
- Sessions hors connexion
OutputConfigurationavec le partage de surface- Sessions de capture retraitables
- Applications tierces
Lorsqu'un client de priorité supérieure ouvre un appareil photo en mode normal, le système évince tous les clients d'appareils photo partagés.