在 Android 9 以下版本中,由於螢幕和輸入裝置之間沒有關聯機制,因此無法透過觸控與多個螢幕互動。舉例來說,觸控螢幕可以提供 HDMI 視訊輸出 (在 Android 上會註冊為螢幕),以及觸控螢幕的 USB 輸出 (在 Android 上會註冊為輸入裝置)。如果以這種方式連接多部裝置,就無法判斷哪個輸入裝置屬於哪個螢幕。如果摺疊式裝置內建多個螢幕,也會發生同樣的問題。
Android 10 新增了指定輸入裝置所屬螢幕的機制。關聯作業是透過通訊埠編號完成,其中「port」是指螢幕連接的實體通訊埠。
舉例來說,如果 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
陣列。接著,您就能找出產生最近事件的裝置。然後在 Event Hub State 中找到對應的裝置。
如要判斷指派給已連線螢幕的顯示連接埠,請使用 adb shell dumpsys display
,然後在「顯示裝置」下方尋找每個螢幕的 DisplayDeviceInfo
address
屬性。或者,您也可以使用 adb shell dumpsys SurfaceFlinger --display-id
傾印所有已連線螢幕的識別資訊。另請參閱「靜態螢幕 ID」。
如果為特定輸入裝置指定關聯,但系統中沒有對應的螢幕,輸入裝置會停用,直到出現對應的螢幕為止。只有觸控裝置會進行關聯。
動態多螢幕的轉送
Android 10 可讓您設定靜態多螢幕裝置。動態關聯尚未啟用。不過,您可以為不一定會顯示或使用虛擬輸入裝置的螢幕和輸入面板提供路徑資訊,然後為這些虛擬裝置提供額外的路徑資訊,解決部分用途。如果裝置實作支援下列項目:
- 使用擴充底座時,可提供類似桌機的體驗,然後提供轉送設定,將擴充底座上所連線輸入配件的輸入內容 (依通訊埠識別) 轉送至外接螢幕 (依通訊埠識別)。
- 連線至外部螢幕時,主要螢幕會做為輸入來源 (例如觸控板),然後提供轉送設定,將虛擬觸控面板 (以專屬虛擬 ID 識別) 的目標輸入內容轉送至外部螢幕 (以連接埠識別)。
實作
- 如果是實體裝置,系統會使用輸入裝置連接的連接埠,以及螢幕連接的連接埠,將螢幕與觸控螢幕配對。
- 對應會儲存在
InputReaderConfiguration
中。 TouchInputMapper.mViewport
會設為與InputDevice.location
指定的通訊埠相符的可視區域。- 如果在對應檔案中指定輸入裝置連接埠,但目前沒有相符的顯示器連接埠,系統就會停用該連接埠上的輸入裝置。
- 如果未指定特定輸入裝置的通訊埠,系統會根據現有規則設定檢視區塊。
- 輸入驅動程式不需要進行任何核心變更。
- 輸入裝置通訊埠是使用 EVIOCGPHYS ioctl 判斷。