Puoi consentire a più client di accedere contemporaneamente a una videocamera. Per farlo, utilizza le API di sistema Java e Android NDK descritte in questa pagina per condividere l'accesso ai client della videocamera di sistema.
Client principale:client con la priorità più alta tra i client condivisi. Un client principale può creare richieste di acquisizione e modificare i parametri di acquisizione.
Client secondario:tutti gli altri client condivisi sono client secondari. I client secondari non possono creare richieste di acquisizione né modificare i parametri di acquisizione. I client secondari possono inviare richieste solo per avviare o interrompere lo streaming.
Per lo streaming, il servizio della videocamera utilizza i parametri di richiesta di acquisizione predefiniti per il modello di anteprima. Se il client principale sta eseguendo lo streaming, il servizio utilizza i parametri di richiesta di acquisizione specificati dal client principale.
Configurare una sessione condivisa
Per condividere un dispositivo videocamera, fornisci la configurazione della sessione condivisa nel file denominato shared_session_config.xml che si trova in /system_ext/etc/. In questo esempio di codice, l'ID videocamera 0 supporta la condivisione della videocamera con una configurazione che include due stream, ImageReader e 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>
Per eseguire una query sulla configurazione di una sessione condivisa, i client utilizzano CameraCharacteristics per SHARED_SESSION_CONFIGURATION. I client che accedono a una videocamera in modalità condivisa devono utilizzare la configurazione della sessione condivisa. Quando la configurazione della sessione passata
da un client non corrisponde alla configurazione della sessione condivisa, una
createCaptureSession chiamata non riesce.
API Java
CameraManager e CameraDevice forniscono API per aprire le videocamere in modalità condivisa.
API CameraManager
CameraManager fornisce le seguenti API:
isCameraDeviceSharingSupported: i client utilizzano questa API per determinare se una videocamera supporta la modalità condivisa.openSharedCamera: se una videocamera supporta la modalità condivisa, i client utilizzano questa API per aprirla in modalità condivisa.
API CameraDevice.StateCallback
CameraDevice.StateCallback fornisce le seguenti API:
onOpenedInSharedMode: i client ricevono questo callback quando la videocamera viene aperta in modalità condivisa. Il callback indica se il client è il client principale o secondario.onClientSharedAccessPriorityChanged: quando viene aperta una sessione condivisa, questo callback viene attivato quando la priorità di un client viene modificata perché un client con priorità più alta ha aperto o chiuso la stessa videocamera.
CameraSharedCaptureSession
La classe CameraSharedCaptureSession rappresenta una sessione di acquisizione condivisa.
In modalità videocamera condivisa, un client che crea una sessione deve utilizzare il
SESSION_SHARED tipo di sessione.
Quando il sistema crea una sessione, esegui il cast di CameraCaptureSession a CameraSharedCaptureSession.
I client secondari non possono utilizzare createCaptureRequest. Al contrario, i client secondari
utilizzano l'API startStreaming per avviare lo streaming sulle superfici specificate e
l'API stopStreaming per interrompere lo streaming.
API Android NDK
Le app integrate utilizzano queste API Android NDK per aprire una videocamera in modalità condivisa:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Testare le videocamere condivise
Consulta questi test specifici per le videocamere multi-client:
Suite di test del fornitore (VTS): vedi
SharedCameraTestinVtsAidlCameraServiceTargetTestCompatibility Test Suite (CTS): vedi
android.hardware.multiprocess.camera.cts.SharedCameraTestinCtsCameraTestCases
Restrizioni
La modalità videocamera condivisa non supporta le seguenti opzioni:
- Richieste di acquisizione in sequenza
- Sessioni di estensione
- Sessioni ad alta velocità
- Sessioni offline
OutputConfigurationcon condivisione della superficie- Sessioni di acquisizione rielaborabili
- App di terze parti
Quando un client con priorità più alta apre una videocamera in modalità normale, il sistema espelle tutti i client della videocamera condivisa.