ใน Android 9 และเวอร์ชันที่ต่ำกว่านั้น ไม่มีวิธีโต้ตอบกับจอแสดงผลหลายจอ ผ่านการสัมผัส เนื่องจากไม่มีกลไกการเชื่อมโยงระหว่างจอแสดงผลกับอุปกรณ์ อินพุต ตัวอย่างเช่น จอแสดงผลแบบสัมผัสอาจมีเอาต์พุตวิดีโอ HDMI (ซึ่งจะลงทะเบียนเป็นจอแสดงผลใน Android) และเอาต์พุต USB สำหรับหน้าจอสัมผัส (ซึ่งจะลงทะเบียนเป็นอุปกรณ์อินพุต) หากมีการเชื่อมต่ออุปกรณ์หลายเครื่องในลักษณะนี้ จะไม่มีวิธีระบุว่าอุปกรณ์อินพุตใดเป็นของจอแสดงผลใด ปัญหาเดียวกันนี้ยังเกิดขึ้นกับอุปกรณ์พับได้ที่มีจอแสดงผลในตัวหลายจอด้วย
Android 10 ได้เพิ่มกลไกในการระบุว่าอุปกรณ์อินพุตใดเป็นของจอแสดงผลใด การเชื่อมโยงจะทำโดยหมายเลขพอร์ต โดยที่ พอร์ตหมายถึงพอร์ตจริงที่เชื่อมต่อจอแสดงผล
เช่น หากอุปกรณ์ Android มีพอร์ต HDMI 2 พอร์ตที่มีป้ายกำกับ hdmi1
และ hdmi2
ค่าพอร์ตแสดงผลอาจเป็น 1
และ
2
ค่าพอร์ตจะยังคงเหมือนเดิมแม้ว่าจะเชื่อมต่อจอแสดงผลอื่น (เช่น จอแสดงผลรุ่นหรือผู้ผลิตอื่น) เข้ากับพอร์ต HDMI จริงเดียวกันก็ตาม
ซึ่งช่วยให้ผู้ผลิตอุปกรณ์สามารถให้วิธีการประกอบ
และอัปเกรดจอแสดงผลได้
มีการกำหนดค่าการเชื่อมโยงใน /vendor/etc/input-port-associations.xml
เช่น
<ports>
<port display="0" input="usb-xhci-hcd.0.auto-1.1/input0" />
<port display="1" input="usb-xhci-hcd.0.auto-1.2/input0" />
</ports>
ในตัวอย่างด้านบน display="0"
จะระบุพอร์ตที่เชื่อมต่อกับ
จอแสดงผล input="usb-xhci-hcd.0.auto-1.1/input0"
ระบุพอร์ตที่เชื่อมต่ออุปกรณ์อินพุต หากต้องการระบุพอร์ต
ที่เชื่อมโยงกับอุปกรณ์ที่เฉพาะเจาะจง ให้ใช้คำสั่งเทอร์มินัลต่อไปนี้ แล้ว
ตรวจสอบพร็อพเพอร์ตี้location
ของอุปกรณ์เหล่านั้นในสถานะ Event Hub
adb shell dumpsys input
หากมีการเชื่อมต่ออุปกรณ์หลายเครื่อง ให้แตะอุปกรณ์ที่ต้องการเพื่อตรวจสอบ
RecentQueue
อาร์เรย์ในสถานะ Input Dispatcher จากนั้นคุณจะระบุ
อุปกรณ์ที่สร้างเหตุการณ์ล่าสุดได้ จากนั้นคุณจะค้นหา
อุปกรณ์ที่เกี่ยวข้องในสถานะ Event Hub ได้
หากต้องการพิจารณาพอร์ตแสดงผลที่กำหนดให้กับจอแสดงผลที่เชื่อมต่อ ให้ใช้
adb shell dumpsys display
แล้วมองหาพร็อพเพอร์ตี้ address
ของ DisplayDeviceInfo
สำหรับจอแสดงผลแต่ละจอในส่วนอุปกรณ์แสดงผล
หรือใช้ adb shell dumpsys SurfaceFlinger --display-id
เพื่อส่งออก
ข้อมูลการระบุสำหรับจอแสดงผลที่เชื่อมต่อทั้งหมด ดูเพิ่มเติม
ตัวระบุการแสดงผลแบบคงที่
หากคุณระบุการเชื่อมโยงสำหรับอุปกรณ์อินพุตที่เฉพาะเจาะจงและไม่มีจอแสดงผลที่เกี่ยวข้องในระบบ ระบบจะปิดใช้อุปกรณ์อินพุตจนกว่าจอแสดงผลที่เกี่ยวข้องจะปรากฏขึ้น การเชื่อมโยงจะดำเนินการสำหรับอุปกรณ์ที่รองรับการสัมผัสเท่านั้น
การกำหนดเส้นทางสำหรับจอแสดงผลแบบไดนามิกหลายจอ
Android 10 ช่วยให้คุณตั้งค่าอุปกรณ์แบบหลายจอแสดงผลแบบคงที่ได้ ยังไม่ได้เปิดใช้การเชื่อมโยงแบบไดนามิก อย่างไรก็ตาม กรณีการใช้งานบางอย่างสามารถแก้ไขได้โดยการระบุข้อมูลการกำหนดเส้นทางสำหรับจอแสดงผลและแผงป้อนข้อมูลที่ไม่ได้แสดงอยู่เสมอ หรือใช้อุปกรณ์ป้อนข้อมูลเสมือน แล้วระบุข้อมูลการกำหนดเส้นทางเพิ่มเติมไปยังอุปกรณ์เสมือนเหล่านั้น หากการติดตั้งใช้งานอุปกรณ์รองรับสิ่งต่อไปนี้
- ประสบการณ์การใช้งานแบบเดสก์ท็อปด้วยแท่นวาง จากนั้นจะมีการกำหนดค่าการกำหนดเส้นทางเพื่อกำหนดเป้าหมายอินพุตจากอุปกรณ์เสริมอินพุตที่เชื่อมต่อกับแท่นวาง (ระบุโดยพอร์ต) ไปยังจอแสดงผลภายนอก (ระบุโดยพอร์ต)
- หน้าจอหลักทำหน้าที่เป็นแหล่งที่มาของการป้อนข้อมูล (เช่น ทัชแพด) เมื่อเชื่อมต่อกับจอแสดงผลภายนอก จากนั้นจะมีการกำหนดค่าการกำหนดเส้นทางเพื่อกำหนดเป้าหมายการป้อนข้อมูลจากแผงสัมผัสเสมือน (ระบุโดยรหัสเสมือนที่ไม่ซ้ำกัน) ไปยังจอแสดงผลภายนอก (ระบุโดยพอร์ต)
การใช้งาน
- สำหรับอุปกรณ์จริง ระบบจะใช้พอร์ตที่เชื่อมต่ออุปกรณ์ป้อนข้อมูลและพอร์ตที่เชื่อมต่อจอแสดงผลเพื่อจับคู่จอแสดงผลกับหน้าจอสัมผัส
- ระบบจะจัดเก็บการแมปไว้ใน
InputReaderConfiguration
TouchInputMapper.mViewport
จะตั้งค่าเป็นวิวพอร์ตที่ตรงกับ พอร์ตที่ระบุสำหรับInputDevice.location
- หากมีการระบุพอร์ตอุปกรณ์อินพุตในไฟล์การแมป และปัจจุบันไม่มี Viewport ที่มีพอร์ตแสดงผลที่ตรงกัน ระบบจะปิดใช้อุปกรณ์อินพุตในพอร์ตนั้น
- หากไม่ได้ระบุพอร์ตสำหรับอุปกรณ์อินพุตที่เฉพาะเจาะจง ระบบจะตั้งค่า Viewport ตามกฎที่มีอยู่
- ไม่จำเป็นต้องเปลี่ยนแปลงเคอร์เนลในไดรเวอร์อินพุต
- พอร์ตอุปกรณ์อินพุตจะกำหนดโดยใช้ ioctl ของ EVIOCGPHYS