您可以允許多個用戶端同時存取攝影機。如要這麼做,請使用本頁面說明的 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_isCameraDeviceSharingSupported
- ACameraManager_openSharedCamera
- ACameraCaptureSessionShared_startStreaming
- ACameraCaptureSessionShared_logicalCamera_startStreaming
- ACameraCaptureSessionShared_stopStreaming
- ACameraDevice_ClientSharedAccessPriorityChangedCallback
- onClientSharedAccessPriorityChanged
測試共用攝影機
請參閱以下適用於多用戶端攝影機的測試:
- 供應商測試套件 (VTS):請參閱 - SharedCameraTest中的- VtsAidlCameraServiceTargetTest
- 相容性測試套件 (CTS):請參閱 - android.hardware.multiprocess.camera.cts.SharedCameraTest- CtsCameraTestCases
限制
共用攝影機模式不支援下列選項:
- 爆發擷取要求
- 延長工作階段
- 高速工作階段
- 離線工作階段
- OutputConfiguration(透過螢幕分享)
- 可重新處理的擷取工作階段
- 第三方應用程式
當優先順序較高的用戶端在一般模式下開啟相機時,系統會逐一移除所有共用相機的用戶端。
