ใน 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
ในสถานะตัวจัดเตรียมอินพุต จากนั้นคุณจะสามารถระบุ
อุปกรณ์ที่สร้างเหตุการณ์ล่าสุด จากนั้นคุณจะค้นหาอุปกรณ์ที่เกี่ยวข้องได้ในสถานะ Event Hub
หากต้องการระบุพอร์ตจอแสดงผลที่กำหนดให้กับจอแสดงผลที่เชื่อมต่อ ให้ใช้ adb shell dumpsys display
แล้วมองหาพร็อพเพอร์ตี้ address
ของ DisplayDeviceInfo
สำหรับการแสดงผลแต่ละรายการในส่วน "อุปกรณ์แสดงผล"
หรือใช้ adb shell dumpsys SurfaceFlinger --display-id
เพื่อถ่ายโอนข้อมูลระบุตัวตนสำหรับจอแสดงผลที่เชื่อมต่อทั้งหมด ดูตัวระบุการแสดงผลแบบคงที่เพิ่มเติม
หากคุณระบุการเชื่อมโยงสำหรับอุปกรณ์อินพุตเฉพาะและจอแสดงผลที่เกี่ยวข้องไม่ปรากฏในระบบ อุปกรณ์อินพุตจะถูกปิดใช้งานจนกว่าจอแสดงผลที่เกี่ยวข้องจะปรากฏ การเชื่อมโยงจะดำเนินการกับอุปกรณ์แบบสัมผัสเท่านั้น
การกำหนดเส้นทางสำหรับหลายจอแสดงผลแบบไดนามิก
Android 10 ให้คุณตั้งค่าอุปกรณ์แบบหลายจอแสดงผล แบบภาพนิ่งได้ ยังไม่ได้เปิดใช้การเชื่อมโยงแบบไดนามิก อย่างไรก็ตาม กรณีการใช้งานบางกรณีแก้ไขได้ด้วยการระบุข้อมูลการกำหนดเส้นทางสำหรับจอแสดงผลและแผงอินพุตที่ไม่มีอยู่บ่อยๆ หรือใช้อุปกรณ์อินพุตเสมือน แล้วให้ข้อมูลการกำหนดเส้นทางเพิ่มเติมแก่อุปกรณ์เสมือนเหล่านั้น หากการใช้งานอุปกรณ์รองรับ
- การใช้งานเหมือนเดสก์ท็อปกับแท่นชาร์จจึงอาจมีการกำหนดค่าการกำหนดเส้นทางให้กับอินพุตเป้าหมายจากอุปกรณ์เสริมอินพุตที่เชื่อมต่อกับแท่นชาร์จ (ระบุได้โดยพอร์ต) ไปยังจอแสดงผลภายนอก (ระบุด้วยพอร์ต)
- หน้าจอหลักซึ่งทำหน้าที่เป็นแหล่งที่มาของอินพุต (เช่น ทัชแพด) เมื่อเชื่อมต่อกับจอแสดงผลภายนอก อาจมีการกำหนดค่าการกำหนดเส้นทางเพื่อกำหนดเป้าหมายอินพุตจากแผงระบบสัมผัสเสมือน (ระบุโดยรหัสเสมือนที่ไม่ซ้ำ) ไปยังจอแสดงผลภายนอก (ระบุโดยพอร์ต)
การใช้งาน
- สำหรับอุปกรณ์จริง ระบบจะใช้พอร์ตที่อุปกรณ์อินพุตเชื่อมต่ออยู่และพอร์ตที่จอแสดงผลเชื่อมต่ออยู่เพื่อจับคู่จอแสดงผลกับหน้าจอสัมผัส
- ระบบจะจัดเก็บการแมปไว้ใน
InputReaderConfiguration
TouchInputMapper.mViewport
ได้รับการตั้งค่าเป็นวิวพอร์ตที่ตรงกับพอร์ตที่ระบุสำหรับInputDevice.location
- หากมีการระบุพอร์ตของอุปกรณ์อินพุตในไฟล์การแมป และปัจจุบันไม่มีวิวพอร์ตที่มีพอร์ตการแสดงผลที่ตรงกัน อุปกรณ์อินพุตบนพอร์ตนั้นจะถูกปิดใช้งาน
- หากไม่ได้ระบุพอร์ตสำหรับอุปกรณ์อินพุตใดอุปกรณ์หนึ่ง ระบบจะตั้งค่าวิวพอร์ตตามกฎที่มีอยู่
- โดยที่คุณไม่จำเป็นต้องเปลี่ยนแปลงเคอร์เนลในไดรเวอร์อินพุต
- พอร์ตของอุปกรณ์อินพุตจะกำหนดโดยใช้ EVIOCGPHYS ioctl