マルチ クライアント カメラを有効にする

複数のクライアントが同時にカメラにアクセスできるようにすることができます。そのためには、このページで説明する Java および Android NDK システム API を使用して、システム カメラ クライアントへのアクセスを共有します。

  • プライマリ クライアント: 共有クライアントの中で最も優先度の高いクライアント。プライマリ クライアントは、キャプチャ リクエストを作成し、キャプチャ パラメータを変更できます。

  • セカンダリ クライアント: 他のすべての共有クライアントはセカンダリ クライアントです。セカンダリ クライアントは、キャプチャ リクエストを作成することも、キャプチャ パラメータを変更することもできません。セカンダリ クライアントは、ストリーミングの開始または停止のリクエストのみを送信できます。

    ストリーミングの場合、カメラ サービスはプレビュー テンプレートのデフォルトのキャプチャ リクエスト パラメータを使用します。プライマリ クライアントがストリーミングしている場合、サービスはプライマリ クライアントが指定したキャプチャ リクエスト パラメータを使用します。

共有セッションを構成する

カメラデバイスを共有するには、/system_ext/etc/ にある shared_session_config.xml という名前のファイルで共有セッション構成を指定します。このコードサンプルでは、カメラ ID 0 は、2 つのストリーム ImageReaderSurfaceView を含む構成でカメラの共有をサポートしています。

<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>

共有セッション構成をクエリするには、クライアントは SHARED_SESSION_CONFIGURATIONCameraCharacteristics を使用します。共有モードでカメラにアクセスするクライアントは、共有セッション構成を使用する必要があります。クライアントから渡されたセッション構成が共有セッション構成と一致しない場合、createCaptureSession 呼び出しは失敗します。

Java API

CameraManagerCameraDevice は、共有モードでカメラを開くための API を提供します。

CameraManager API

CameraManager は次の API を提供します。

  • isCameraDeviceSharingSupported: クライアントは、この API を使用して、カメラが共有モードをサポートしているかどうかを判断します。

  • openSharedCamera: カメラが共有モードをサポートしている場合、クライアントはこの API を使用して共有モードでカメラを開きます。

CameraDevice.StateCallback API

CameraDevice.StateCallback は次の API を提供します。

  • onOpenedInSharedMode: カメラが共有モードで開かれたときに、クライアントがこのコールバックを受け取ります。コールバックは、クライアントがプライマリ クライアントかセカンダリ クライアントかを示します。

  • onClientSharedAccessPriorityChanged: 共有セッションが開いているときに、優先度の高いクライアントが同じカメラを開いたか閉じたためにクライアントの優先度が変更された場合に、このコールバックがトリガーされます。

CameraSharedCaptureSession

CameraSharedCaptureSession クラスは、共有キャプチャ セッションを表します。共有カメラモードでは、セッションを作成するクライアントは SESSION_SHARED セッション タイプを使用する必要があります。

システムがセッションを作成するときに、CameraCaptureSessionCameraSharedCaptureSession にキャストします。

セカンダリ クライアントは createCaptureRequest を使用できません。代わりに、セカンダリ クライアントは startStreaming API を使用して指定されたサーフェスでストリーミングを開始し、stopStreaming API を使用してストリーミングを停止します。

Android NDK API

組み込みアプリは、次の Android NDK API を使用して共有モードでカメラを開きます。

共有カメラをテストする

マルチクライアント カメラに固有のテストは次のとおりです。

制限

共有カメラモードでは、次のオプションはサポートされていません。

  • バースト キャプチャ リクエスト
  • 拡張セッション
  • 高速セッション
  • オフライン セッション
  • OutputConfiguration(サーフェス共有あり)
  • 再処理可能なキャプチャ セッション
  • サードパーティ製アプリ

優先度の高いクライアントが通常モードでカメラを開くと、システムは共有カメラ クライアントをすべて強制終了します。