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

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

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

ตัวอย่างเช่น หากอุปกรณ์ Android มีพอร์ต HDMI สองพอร์ตที่มีป้ายกำกับ 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 ของอุปกรณ์เหล่านั้นในสถานะฮับเหตุการณ์

adb shell dumpsys input

หากมีอุปกรณ์หลายเครื่องเชื่อมต่ออยู่ ให้แตะอุปกรณ์เฉพาะเพื่อตรวจสอบอาร์เรย์ RecentQueue ในสถานะ Input Dispatcher จากนั้นคุณจะสามารถระบุอุปกรณ์เหล่านั้นที่สร้างเหตุการณ์ล่าสุดได้ จากนั้นคุณจะพบอุปกรณ์ที่เกี่ยวข้องในสถานะ Event Hub

หากต้องการกำหนดพอร์ตจอแสดงผลที่กำหนดให้กับจอแสดงผลที่เชื่อมต่อ ให้ใช้ adb shell dumpsys display จากนั้นค้นหาคุณสมบัติที่ address ของ DisplayDeviceInfo สำหรับจอแสดงผลแต่ละจอภายใต้อุปกรณ์แสดงผล หรือใช้ adb shell dumpsys SurfaceFlinger --display-id เพื่อดัมพ์ข้อมูลระบุตัวตนสำหรับจอแสดงผลที่เชื่อมต่อทั้งหมด ดูเพิ่มเติมที่ ตัวระบุการแสดงผลแบบคงที่

หากคุณระบุการเชื่อมโยงสำหรับอุปกรณ์อินพุตเฉพาะและไม่มีจอแสดงผลที่เกี่ยวข้องในระบบ อุปกรณ์อินพุตจะถูกปิดใช้งานจนกว่าจอแสดงผลที่เกี่ยวข้องจะปรากฏขึ้น การเชื่อมโยงจะดำเนินการเฉพาะกับอุปกรณ์ระบบสัมผัสเท่านั้น

การกำหนดเส้นทางสำหรับจอแสดงผลหลายจอแบบไดนามิก

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

  • ประสบการณ์ที่เหมือนกับเดสก์ท็อปกับสถานีเชื่อมต่อ การกำหนดค่าเส้นทางสามารถจัดเตรียมให้กับอินพุตเป้าหมายจากอุปกรณ์เสริมอินพุตที่เชื่อมต่อกับสถานีเชื่อมต่อ (ระบุเฉพาะโดยพอร์ต) ไปยังจอแสดงผลภายนอก (ระบุโดยพอร์ต)
  • หน้าจอหลักทำหน้าที่เป็นแหล่งอินพุต (เช่น ทัชแพด) เมื่อเชื่อมต่อกับจอแสดงผลภายนอก จากนั้นสามารถกำหนดค่าการกำหนดเส้นทางให้กับอินพุตเป้าหมายจากแผงสัมผัสเสมือน (ระบุโดย ID เสมือนเฉพาะ) ไปยังจอแสดงผลภายนอก (ระบุโดยพอร์ต) .

การนำไปปฏิบัติ

  • สำหรับอุปกรณ์ทางกายภาพ พอร์ตที่อุปกรณ์อินพุตเชื่อมต่ออยู่และพอร์ตที่จอแสดงผลเชื่อมต่ออยู่ จะถูกใช้เพื่อจับคู่จอแสดงผลกับหน้าจอสัมผัส
  • การแมปจะถูกเก็บไว้ใน InputReaderConfiguration
  • TouchInputMapper.mViewport ถูกตั้งค่าเป็นวิวพอร์ตที่ตรงกับพอร์ตที่ระบุสำหรับ InputDevice.location
  • หากมีการระบุพอร์ตอุปกรณ์อินพุตในไฟล์การแมป และขณะนี้ไม่มีวิวพอร์ตที่มีพอร์ตการแสดงผลที่ตรงกัน อุปกรณ์อินพุตบนพอร์ตนั้นจะถูกปิดใช้งาน
  • หากไม่ได้ระบุพอร์ตสำหรับอุปกรณ์อินพุตเฉพาะ วิวพอร์ตจะถูกตั้งค่าตามกฎที่มีอยู่
  • ไม่จำเป็นต้องเปลี่ยนแปลงเคอร์เนลในไดรเวอร์อินพุต
  • พอร์ตอุปกรณ์อินพุตถูกกำหนดโดยใช้ EVIOCGPHYS ioctl