Sie können mehreren Clients gleichzeitig den Zugriff auf eine Kamera ermöglichen. Verwenden Sie dazu die auf dieser Seite beschriebenen Java- und Android NDK-System-APIs, um den Zugriff auf Systemkamera-Clients freizugeben.
Primärer Client:Der Client mit der höchsten Priorität unter den gemeinsam genutzten Clients. Ein primärer Client kann Erfassungsanfragen erstellen und Erfassungsparameter ändern.
Sekundärkunde:Alle anderen gemeinsam genutzten Kunden sind Sekundärkunden. Sekundäre Clients können keine Erfassungsanfragen erstellen und auch keine Erfassungsparameter ändern. Sekundäre Clients können nur Anfragen zum Starten oder Beenden des Streamings senden.
Für das Streaming verwendet der Kameradienst die Standardparameter für die Aufnahmeanfrage für die Vorschauvorlage. Wenn der primäre Client streamt, verwendet der Dienst die vom primären Client angegebenen Parameter für die Erfassungsanfrage.
Geteilte Sitzung konfigurieren
Wenn Sie ein Kameragerät freigeben möchten, geben Sie die Konfiguration der freigegebenen Sitzung in der Datei shared_session_config.xml im Verzeichnis /system_ext/etc/ an. Im folgenden Codebeispiel unterstützt die Kamera-ID 0 die gemeinsame Nutzung von Kameras mit einer Konfiguration, die zwei Streams umfasst: ImageReader und 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>
Um eine Konfiguration für eine freigegebene Sitzung abzufragen, verwenden Clients CameraCharacteristics für SHARED_SESSION_CONFIGURATION. Clients, die im freigegebenen Modus auf eine Kamera zugreifen, müssen die Konfiguration der freigegebenen Sitzung verwenden. Wenn die von einem Client übergebene Sitzungskonfiguration nicht mit der Konfiguration der freigegebenen Sitzung übereinstimmt, schlägt ein createCaptureSession-Aufruf fehl.
Java APIs
CameraManager und CameraDevice bieten APIs zum Öffnen von Kameras im freigegebenen Modus.
CameraManager-APIs
CameraManager bietet folgende APIs:
isCameraDeviceSharingSupported: Clients verwenden diese API, um festzustellen, ob eine Kamera den gemeinsamen Modus unterstützt.openSharedCamera: Wenn eine Kamera den freigegebenen Modus unterstützt, verwenden Clients diese API, um die Kamera im freigegebenen Modus zu öffnen.
CameraDevice.StateCallback-APIs
CameraDevice.StateCallback bietet folgende APIs:
onOpenedInSharedMode: Clients erhalten diesen Callback, wenn die Kamera im freigegebenen Modus geöffnet wird. Der Callback gibt an, ob der Client der primäre oder sekundäre Client ist.onClientSharedAccessPriorityChanged: Wenn eine freigegebene Sitzung geöffnet wird, wird dieser Callback ausgelöst, wenn sich die Priorität eines Clients ändert, weil ein Client mit höherer Priorität dieselbe Kamera geöffnet oder geschlossen hat.
CameraSharedCaptureSession
Die Klasse CameraSharedCaptureSession stellt eine freigegebene Aufnahmesitzung dar.
Im Modus für freigegebene Kameras muss ein Client, der eine Sitzung erstellt, den Sitzungstyp SESSION_SHARED verwenden.
Wenn das System eine Sitzung erstellt, wird CameraCaptureSession in CameraSharedCaptureSession umgewandelt.
Sekundäre Clients können createCaptureRequest nicht verwenden. Stattdessen verwenden sekundäre Clients die startStreaming API, um das Streaming auf bestimmten Oberflächen zu starten, und die stopStreaming API, um das Streaming zu beenden.
Android NDK APIs
Integrierte Apps verwenden diese Android NDK-APIs, um eine Kamera im freigegebenen Modus zu öffnen:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
Geteilte Kameras testen
Hier finden Sie Tests speziell für Kameras mit mehreren Clients:
Vendor Test Suite (VTS): Siehe
SharedCameraTestinVtsAidlCameraServiceTargetTestCompatibility Test Suite (CTS): Siehe
android.hardware.multiprocess.camera.cts.SharedCameraTestinCtsCameraTestCases
Einschränkungen
Im Modus „Gemeinsame Kamera“ werden die folgenden Optionen nicht unterstützt:
- Burst-Aufnahmeanfragen
- Erweiterungssitzungen
- Highspeed-Sitzungen
- Offlinesitzungen
OutputConfigurationmit Oberflächenfreigabe- Erfassungssitzungen, die neu verarbeitet werden können
- Apps von Drittanbietern
Wenn ein Client mit höherer Priorität eine Kamera im normalen Modus öffnet, werden alle Clients mit gemeinsam genutzter Kamera vom System entfernt.