여러 클라이언트가 동시에 카메라에 액세스하도록 설정할 수 있습니다. 이렇게 하려면 이 페이지에 설명된 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>
공유 세션 구성을 쿼리하기 위해 클라이언트는 SHARED_SESSION_CONFIGURATION에 CameraCharacteristics를 사용합니다. 공유 모드에서 카메라에 액세스하는 클라이언트는 공유 세션 구성을 사용해야 합니다. 클라이언트에서 전달한 세션 구성이 공유 세션 구성과 일치하지 않으면 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):
VtsAidlCameraServiceTargetTest의SharedCameraTest참고호환성 테스트 모음 (CTS):
CtsCameraTestCases의android.hardware.multiprocess.camera.cts.SharedCameraTest참고
제한사항
공유 카메라 모드에서는 다음 옵션이 지원되지 않습니다.
- 버스트 캡처 요청
- 확장 프로그램 세션
- 고속 세션
- 오프라인 세션
- 표면 공유를 사용한
OutputConfiguration - 재처리 가능한 캡처 세션
- 서드 파티 앱
우선순위가 더 높은 클라이언트가 일반 모드에서 카메라를 열면 시스템은 공유 카메라 클라이언트를 모두 삭제합니다.