輸入路由

在 Android 9 及更低版本中,無法通過觸摸與多個顯示器進行交互,因為顯示器和輸入設備之間沒有關聯機制。例如,觸摸屏顯示器可以提供 HDMI 視頻輸出(將在 Android 上註冊為顯示器)和用於觸摸屏的 USB 輸出(將註冊為輸入設備)。如果以這種方式連接多個設備,將無法確定哪個輸入設備屬於哪個顯示器。同樣的問題也適用於具有多個內置顯示器的可折疊設備。

Android 10 添加了一種機制來指定哪些輸入設備屬於哪些顯示器。關聯是通過端口號完成的,其中端口是指顯示器連接到的物理端口。

例如,如果 Android 設備有兩個標記為hdmi1hdmi2的 HDMI 端口,則顯示端口值可能是12 。即使將不同的顯示器(例如不同的顯示器型號或製造商)連接到同一個物理 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

如果連接了許多設備,請點擊特定設備以檢查 Input Dispatcher State 中的RecentQueue數組。然後,您可以識別那些生成最近事件的設備。然後您可以在事件中心狀態中找到相應的設備。

要確定分配給已連接顯示器的顯示端口,請使用adb shell dumpsys display ,然後在 Display Devices 下查找每個顯示器的DisplayDeviceInfoaddress屬性。或者,使用adb shell dumpsys SurfaceFlinger --display-id轉儲所有連接顯示器的標識信息。另請參見靜態顯示標識符

如果您為特定輸入設備指定關聯並且系統中不存在相應的顯示,則輸入設備將被禁用,直到出現相應的顯示。僅對觸摸設備執行關聯。

動態多顯示器的路由

Android 10 使您能夠設置靜態多顯示器設備。動態關聯尚未啟用。但是,可以通過為並不總是存在的顯示器和輸入面板提供路由信息或使用虛擬輸入設備然後向這些虛擬設備提供附加路由信息來解決某些用例。如果設備實現支持:

  • 使用擴展塢的類似桌面的體驗,然後可以提供路由配置以將輸入從連接到擴展塢的輸入附件(由端口唯一標識)到外部顯示器(由端口標識)。
  • 當連接到外部顯示器時,主屏幕充當輸入源(例如觸摸板),然後可以提供路由配置以將目標輸入從虛擬觸摸面板(由唯一的虛擬 ID 標識)到外部顯示器(由端口標識) .

執行

  • 對於物理設備,輸入設備所連接的端口和顯示器所連接的端口,用於將顯示器與觸摸屏相匹配。
  • 映射存儲在InputReaderConfiguration中。
  • TouchInputMapper.mViewport設置為與InputDevice.location指定的端口匹配的視口。
  • 如果在映射文件中指定了輸入設備端口,並且當前沒有具有匹配顯示端口的視口,則禁用該端口上的輸入設備。
  • 如果未為特定輸入設備指定端口,則根據現有規則設置視口。
  • 輸入驅動程序不需要內核更改。
  • 輸入設備端口使用 EVIOCGPHYS ioctl 確定。