คุณสามารถเปิดใช้ไคลเอ็นต์หลายรายการให้เข้าถึงกล้องพร้อมกันได้ โดยใช้ Java และ Android NDK System API ที่อธิบายไว้ในหน้านี้เพื่อแชร์การเข้าถึงไคลเอ็นต์กล้องของระบบ
ไคลเอ็นต์หลัก: ไคลเอ็นต์ที่มีลำดับความสำคัญสูงสุดในบรรดาไคลเอ็นต์ที่แชร์ ไคลเอ็นต์หลักสามารถสร้างคำขอการจับภาพและแก้ไขพารามิเตอร์การจับภาพได้
ไคลเอ็นต์รอง: ไคลเอ็นต์ที่แชร์อื่นๆ ทั้งหมดเป็นไคลเอ็นต์รอง ไคลเอ็นต์รองไม่สามารถสร้างคำขอการจับภาพและแก้ไขพารามิเตอร์การจับภาพได้ ไคลเอ็นต์รองสามารถส่งคำขอเพื่อเริ่มหรือหยุดสตรีมมิงเท่านั้น
สำหรับการสตรีมมิง บริการกล้องจะใช้พารามิเตอร์คำขอการจับภาพเริ่มต้นสำหรับเทมเพลตการแสดงตัวอย่าง หากไคลเอ็นต์หลักกำลังสตรีมมิง บริการจะใช้พารามิเตอร์คำขอการจับภาพที่ไคลเอ็นต์หลักระบุ
กำหนดค่าเซสชันที่แชร์
หากต้องการแชร์อุปกรณ์กล้อง ให้ระบุการกำหนดค่าเซสชันที่แชร์ในไฟล์ชื่อ 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 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.SharedCameraTestในCtsCameraTestCases
ข้อจำกัด
โหมดกล้องที่แชร์ไม่ รองรับตัวเลือกต่อไปนี้
- คำขอการจับภาพแบบต่อเนื่อง
- เซสชันส่วนขยาย
- เซสชันความเร็วสูง
- เซสชันออฟไลน์
OutputConfigurationที่มีการแชร์พื้นผิว- เซสชันการจับภาพที่ประมวลผลซ้ำได้
- แอปของบุคคลที่สาม
เมื่อไคลเอ็นต์ที่มีลำดับความสำคัญสูงกว่าเปิดกล้องในโหมดปกติ ระบบจะนำไคลเอ็นต์กล้องที่แชร์ทั้งหมดออก