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