คุณอนุญาตให้ไคลเอ็นต์หลายรายเข้าถึงกล้องพร้อมกันได้ โดยให้ใช้ API ของระบบ Java และ Android NDK ที่อธิบายไว้ในหน้านี้เพื่อแชร์สิทธิ์เข้าถึงไคลเอ็นต์กล้องของระบบ
ไคลเอ็นต์หลัก: ไคลเอ็นต์ที่มีลำดับความสำคัญสูงสุดในกลุ่มไคลเอ็นต์ที่แชร์ ไคลเอ็นต์หลัก สามารถสร้างคำขอการจับภาพและแก้ไขพารามิเตอร์การจับภาพได้
ไคลเอ็นต์รอง: ไคลเอ็นต์ที่แชร์อื่นๆ ทั้งหมดคือไคลเอ็นต์รอง ไคลเอ็นต์รองจะสร้างคำขอแคปเจอร์หรือแก้ไขพารามิเตอร์แคปเจอร์ไม่ได้ ไคลเอ็นต์รองจะส่งคำขอเพื่อเริ่มหรือหยุด การสตรีมได้เท่านั้น
สำหรับการสตรีม บริการกล้องจะใช้พารามิเตอร์คำขอแคปเจอร์เริ่มต้น สำหรับเทมเพลตตัวอย่าง หากไคลเอ็นต์หลักกำลังสตรีม บริการจะใช้พารามิเตอร์คำขอแคปเจอร์ที่ไคลเอ็นต์หลักระบุ
กำหนดค่าเซสชันที่แชร์
หากต้องการแชร์อุปกรณ์กล้อง ให้ระบุการกำหนดค่าเซสชันที่แชร์ในไฟล์
ชื่อ shared_session_config.xml ซึ่งอยู่ใน /system_ext/etc/ ในโค้ด
ตัวอย่างนี้ กล้องที่มีรหัส 0 รองรับการแชร์กล้องด้วยการกำหนดค่าที่มี
สตรีม 2 รายการ ได้แก่ 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 APIs
CameraManager และ CameraDevice มี API สำหรับเปิดกล้องในโหมดที่แชร์
CameraManager API
CameraManager มี API ดังนี้
isCameraDeviceSharingSupported: ไคลเอ็นต์ใช้ API นี้เพื่อตรวจสอบว่ากล้องรองรับโหมดที่แชร์หรือไม่openSharedCamera: หากกล้องรองรับโหมดที่แชร์ ไคลเอ็นต์จะใช้ API นี้เพื่อเปิดกล้องในโหมดที่แชร์
API ของ CameraDevice.StateCallback
CameraDevice.StateCallback มี API ดังนี้
onOpenedInSharedMode: ไคลเอ็นต์จะได้รับการเรียกกลับนี้เมื่อเปิดกล้องในโหมดที่แชร์ การเรียกกลับจะระบุว่าไคลเอ็นต์เป็นไคลเอ็นต์หลักหรือรองonClientSharedAccessPriorityChanged: เมื่อเปิดเซสชันที่แชร์ ระบบจะเรียกใช้การเรียกกลับนี้เมื่อมีการเปลี่ยนลำดับความสำคัญของไคลเอ็นต์เนื่องจาก ไคลเอ็นต์ที่มีลำดับความสำคัญสูงกว่าเปิดหรือปิดกล้องเดียวกัน
CameraSharedCaptureSession
คลาส CameraSharedCaptureSession แสดงถึงเซสชันการจับภาพที่แชร์
ในโหมดกล้องที่ใช้ร่วมกัน ไคลเอ็นต์ที่สร้างเซสชันต้องใช้ประเภทเซสชัน SESSION_SHARED
เมื่อระบบสร้างเซสชัน ให้แคสต์CameraCaptureSessionไปยัง
CameraSharedCaptureSession
ไคลเอ็นต์รองจะใช้ createCaptureRequest ไม่ได้ แต่ไคลเอ็นต์รอง
จะใช้ API startStreaming เพื่อเริ่มสตรีมบนแพลตฟอร์มที่ระบุ และ
API stopStreaming เพื่อหยุดสตรีม
API ของ Android NDK
แอปในตัวใช้ Android NDK API เหล่านี้เพื่อเปิดกล้องในโหมดที่แชร์
ACameraManager_isCameraDeviceSharingSupportedACameraManager_openSharedCameraACameraCaptureSessionShared_startStreamingACameraCaptureSessionShared_logicalCamera_startStreamingACameraCaptureSessionShared_stopStreamingACameraDevice_ClientSharedAccessPriorityChangedCallbackonClientSharedAccessPriorityChanged
ทดสอบกล้องที่แชร์
ดูการทดสอบต่อไปนี้ที่เฉพาะเจาะจงสำหรับกล้องแบบหลายไคลเอ็นต์
ชุดทดสอบของผู้ให้บริการ (VTS): ดู
SharedCameraTestในVtsAidlCameraServiceTargetTestชุดทดสอบความเข้ากันได้ (CTS): ดู
android.hardware.multiprocess.camera.cts.SharedCameraTestในCtsCameraTestCases
ข้อจำกัด
โหมดกล้องที่แชร์ไม่รองรับตัวเลือกต่อไปนี้
- คำขอการจับภาพแบบต่อเนื่อง
- เซสชันส่วนขยาย
- เซสชันความเร็วสูง
- เซสชันออฟไลน์
OutputConfigurationด้วยการแชร์พื้นผิว- เซสชันการจับภาพที่ประมวลผลซ้ำได้
- แอปของบุคคลที่สาม
เมื่อไคลเอ็นต์ที่มีลำดับความสำคัญสูงกว่าเปิดกล้องในโหมดปกติ ระบบจะนำ ไคลเอ็นต์กล้องที่แชร์ทั้งหมดออก