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

ใน 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