การกำหนดเส้นทางอินพุต

ใน Android 9 และต่ำกว่า ผู้ใช้ไม่สามารถโต้ตอบกับจอแสดงผลหลายจอผ่านการสัมผัสได้ เนื่องจากไม่มีกลไกการเชื่อมโยงระหว่างจอแสดงผลกับอุปกรณ์อินพุต เช่น จอแสดงผลแบบหน้าจอสัมผัสอาจมีเอาต์พุตวิดีโอ HDMI (ซึ่งจะลงทะเบียนเป็นจอแสดงผลใน Android) และเอาต์พุต USB สำหรับหน้าจอสัมผัส (ซึ่งจะลงทะเบียนเป็นอุปกรณ์อินพุต) หากเชื่อมต่ออุปกรณ์หลายเครื่องในลักษณะนี้ จะไม่มีวิธีระบุอุปกรณ์อินพุตของจอแสดงผลแต่ละเครื่อง ปัญหาเดียวกันนี้เกิดขึ้นกับอุปกรณ์แบบพับได้ที่มีจอแสดงผลในตัวหลายจอ

Android 10 เพิ่มกลไกในการระบุอุปกรณ์อินพุตที่เป็นของจอแสดงผลใด การเชื่อมโยงจะดําเนินการโดยหมายเลขพอร์ต พอร์ต หมายถึงพอร์ตที่มีการเชื่อมต่อกับจอแสดงผล

ตัวอย่างเช่น หากอุปกรณ์ Android มีพอร์ต HDMI 2 พอร์ตที่ติดป้ายกำกับว่า hdmi1 และ hdmi2 ค่าของพอร์ต Display อาจได้แก่ 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