在 Android 9 及更低版本中,無法透過觸控與多個顯示器進行交互,因為顯示器和輸入裝置之間沒有關聯機制。例如,觸控螢幕顯示器可以提供 HDMI 視訊輸出(將在 Android 上註冊為顯示器)和觸控螢幕的 USB 輸出(將註冊為輸入裝置)。如果以這種方式連接多個設備,則無法確定哪個輸入設備屬於哪個顯示器。同樣的問題也適用於具有多個內建顯示器的可折疊設備。
Android 10 增加了一種機制來指定哪些輸入裝置屬於哪些顯示器。此關聯是透過連接埠號碼完成的,其中連接埠指的是顯示器所連接的實體連接埠。
例如,如果 Android 裝置有兩個標記為hdmi1
和hdmi2
的 HDMI 端口,則顯示端口值可能為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
陣列。然後,您可以識別產生最近事件的那些裝置。然後您可以在事件中心狀態中找到相應的設備。
若要確定指派給連接的顯示器的顯示端口,請使用adb shell dumpsys display
,然後在「顯示裝置」下尋找每個顯示器的DisplayDeviceInfo
address
屬性。或者,使用adb shell dumpsys SurfaceFlinger --display-id
轉儲所有連接的顯示器的識別資訊。另請參閱靜態顯示標識符。
如果您指定特定輸入裝置的關聯,且系統中不存在相應的顯示,則輸入裝置將被停用,直到出現相應的顯示。僅針對觸控設備執行關聯。
動態多顯示器路由
Android 10 可讓您設定靜態多顯示裝置。動態關聯尚未啟用。但是,可以透過為不總是存在的顯示器和輸入面板提供路由資訊或使用虛擬輸入設備然後向這些虛擬設備提供附加路由資訊來解決某些用例。如果設備實現支援:
- 使用擴充座獲得類似桌面的體驗,然後可以提供路由配置來將連接到擴充座(由連接埠唯一標識)的輸入配件的目標輸入傳送到外部顯示器(由連接埠標識)。
- 當連接到外部顯示器時,主螢幕充當輸入來源(例如觸控板),然後可以提供路由配置以將目標輸入從虛擬觸控面板(由唯一的虛擬 ID 標識)到外部顯示器(由連接埠標識) 。
執行
- 對於實體設備,連接輸入設備的連接埠和連接顯示器的連接埠用於將顯示器與觸控螢幕相匹配。
- 映射儲存在
InputReaderConfiguration
中。 -
TouchInputMapper.mViewport
設定為與InputDevice.location
指定的連接埠相符的視窗。 - 如果在映射檔案中指定了輸入設備端口,且目前沒有具有匹配顯示端口的視口,則該端口上的輸入設備將被停用。
- 如果沒有為特定輸入設備指定端口,則根據現有規則設定視口。
- 輸入驅動程式中不需要更改內核。
- 輸入設備連接埠是使用 EVIOCGPHYS ioctl 確定的。