您可以允許多個用戶端同時存取攝影機。如要這麼做,請使用本頁面說明的 Java 和 Android NDK 系統 API,分享系統相機用戶端的存取權。
主要用戶端:共用用戶端中優先順序最高的用戶端。主要用戶端可以建立擷取要求及修改擷取參數。
次要客戶:所有其他共用客戶都是次要客戶。 次要用戶端無法建立擷取要求,也無法修改擷取參數。次要用戶端只能傳送啟動或停止串流的請求。
如要串流,攝影機服務會使用預覽範本的預設擷取要求參數。如果主要用戶端正在串流,服務會使用主要用戶端指定的擷取要求參數。
設定共用工作階段
如要分享攝影機裝置,請在 /system_ext/etc/ 中名為 shared_session_config.xml 的檔案中提供共用工作階段設定。在本程式碼範例中,攝影機 ID 0 支援攝影機共用,設定包含兩個串流 ImageReader 和 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>
如要查詢共用工作階段設定,用戶端會使用 CameraCharacteristics
進行 SHARED_SESSION_CONFIGURATION。以共用模式存取攝影機的用戶端必須使用共用工作階段設定。如果用戶端傳遞的工作階段設定與共用的工作階段設定不符,createCaptureSession 呼叫就會失敗。
Java API
CameraManager 和 CameraDevice 提供 API,可在共用模式下開啟攝影機。
CameraManager API
CameraManager 提供下列 API:
isCameraDeviceSharingSupported:用戶端可使用這個 API 判斷攝影機是否支援共用模式。openSharedCamera:如果攝影機支援共用模式,用戶端會使用這個 API 開啟共用模式的攝影機。
CameraDevice.StateCallback API
CameraDevice.StateCallback 提供下列 API:
onOpenedInSharedMode:在共用模式下開啟攝影機時,用戶端會收到這個回呼。回呼會指出用戶端是主要還是次要用戶端。onClientSharedAccessPriorityChanged:開啟共用工作階段時,如果優先順序較高的用戶端開啟或關閉相同攝影機,導致用戶端優先順序變更,就會觸發這個回呼。
CameraSharedCaptureSession
CameraSharedCaptureSession 類別代表共用的擷取工作階段。在共用攝影機模式中,建立工作階段的用戶端必須使用 SESSION_SHARED 工作階段類型。
系統建立工作階段時,請將 CameraCaptureSession 轉換為 CameraSharedCaptureSession。
次要用戶端無法使用 createCaptureRequest。次要用戶端會改用 startStreaming API 在指定介面上開始串流,並使用 stopStreaming API 停止串流。
Android NDK API
內建應用程式會使用下列 Android NDK API,以共用模式開啟相機:
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
測試共用攝影機
請參閱以下適用於多用戶端攝影機的測試:
供應商測試套件 (VTS):請參閱
SharedCameraTest中的VtsAidlCameraServiceTargetTest相容性測試套件 (CTS):請參閱
android.hardware.multiprocess.camera.cts.SharedCameraTestCtsCameraTestCases
限制
共用攝影機模式不支援下列選項:
- 爆發擷取要求
- 延長工作階段
- 高速工作階段
- 離線工作階段
OutputConfiguration(透過螢幕分享)- 可重新處理的擷取工作階段
- 第三方應用程式
當優先順序較高的用戶端在一般模式下開啟相機時,系統會逐一移除所有共用相機的用戶端。