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 fotocamera di sistema.
Client principale: il client con la priorità più alta tra i client condivisi. Un client principale può creare richieste di acquisizione e modificare i parametri di acquisizione.
Cliente secondario:tutti gli altri clienti condivisi sono clienti secondari. I clienti 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 predefiniti della richiesta di acquisizione per il modello di anteprima. Se il client principale sta trasmettendo in streaming, il servizio utilizza i parametri della richiesta di acquisizione specificati dal client principale.
Configurare una sessione condivisa
Per condividere un dispositivo con 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 fotocamera 0 supporta la condivisione della fotocamera 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 query su una configurazione di 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
chiamata createCaptureSession non va a buon fine.
API Java
CameraManager e CameraDevice forniscono API per aprire le videocamere in modalità condivisa.
API CameraManager
CameraManager fornisce queste 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 aprire la videocamera in modalità condivisa.
API CameraDevice.StateCallback
CameraDevice.StateCallback fornisce queste API:
onOpenedInSharedMode: i clienti ricevono questo callback quando la videocamera viene aperta in modalità condivisa. Il callback indica se il cliente è il cliente 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à fotocamera condivisa, un client che crea una sessione deve utilizzare il tipo di sessione
SESSION_SHARED.
Quando il sistema crea una sessione, trasmetti CameraCaptureSession a
CameraSharedCaptureSession.
I client secondari non possono utilizzare createCaptureRequest. I client secondari
utilizzano l'API startStreaming per avviare lo streaming su piattaforme specifiche e
l'API stopStreaming per interrompere lo streaming.
API Android NDK
Le app integrate utilizzano queste API Android NDK per aprire una fotocamera in modalità condivisa:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Testare le videocamere condivise
Consulta questi test specifici per le videocamere multi-cliente:
Vendor Test Suite (VTS): vedi
SharedCameraTestinVtsAidlCameraServiceTargetTestSuite di test di compatibilità (CTS): vedi
android.hardware.multiprocess.camera.cts.SharedCameraTestinCtsCameraTestCases
Restrizioni
La modalità Fotocamera condivisa non supporta queste opzioni:
- Richieste di acquisizione burst
- Sessioni di estensione
- Sessioni ad alta velocità
- Sessioni offline
OutputConfigurationcon la condivisione della superficie- Sessioni di acquisizione rielaborabili
- App di terze parti
Quando un client con priorità più elevata apre una videocamera in modalità normale, il sistema espelle tutti i client della videocamera condivisa.