輸入路由

在 Android 9 以下版本中,您無法透過觸控與多個螢幕互動,因為螢幕和輸入裝置之間沒有關聯機制。舉例來說,觸控螢幕顯示器可提供 HDMI 影像輸出 (會在 Android 上註冊為顯示器),以及觸控螢幕的 USB 輸出 (會註冊為輸入裝置)。如果以這種方式連接多部裝置,就無法判斷哪個輸入裝置屬於哪個螢幕。同樣的問題也適用於內建多個螢幕的摺疊式裝置。

Android 10 新增了一種機制,可指定哪些輸入裝置屬於哪些螢幕。關聯會透過通訊埠編號完成,其中「通訊埠」是指螢幕連接的實體通訊埠。

舉例來說,如果 Android 裝置有兩個 HDMI 連接埠,分別標示為 hdmi1hdmi2,則顯示埠值可能會是 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" 指定輸入裝置所連接的通訊埠。如要判斷與特定裝置相關聯的連接埠,請使用下列終端機指令,然後查看 Event Hub 狀態中這些裝置的 location 屬性。

adb shell dumpsys input

如果有多部裝置已連線,請輕觸特定裝置,檢查輸入調度器狀態中的 RecentQueue 陣列。接著,您就可以找出產生最近事件的裝置。接著,您可以在 Event Hub 狀態中找到對應的裝置。

如要判斷已指派給已連接螢幕的顯示埠,請使用 adb shell dumpsys display,然後在「顯示裝置」下尋找每部螢幕的 DisplayDeviceInfo address 屬性。或者,您也可以使用 adb shell dumpsys SurfaceFlinger --display-id 將所有已連線顯示器的 ID 資訊轉儲。另請參閱「靜態顯示 ID」。

如果您為特定輸入裝置指定關聯,但系統中沒有對應的顯示畫面,輸入裝置就會停用,直到顯示畫面出現為止。關聯作業僅適用於觸控裝置。

動態多螢幕轉送

您可以使用 Android 10 設定靜態多螢幕裝置。動態關聯尚未啟用。不過,您可以為不一定會出現或使用虛擬輸入裝置的螢幕和輸入面板提供路由資訊,然後為這些虛擬裝置提供額外的路由資訊,以解決某些用途。如果裝置實作項目支援以下項目:

  • 使用類似電腦的體驗,搭配擴充座,然後提供路由設定,將從連接至擴充座的輸入配件 (透過通訊埠獨立識別) 的目標輸入,傳送至外接螢幕 (透過通訊埠識別)。
  • 當主要螢幕連接至外接螢幕時,會充當輸入來源 (例如觸控板),然後提供路由設定,將從虛擬觸控面板 (以獨特虛擬 ID 識別) 指定的輸入內容,轉送至外接螢幕 (以通訊埠識別)。

實作

  • 對於實體裝置,輸入裝置連接的連接埠和螢幕連接的連接埠,用於將螢幕與觸控螢幕配對。
  • 對應項目會儲存在 InputReaderConfiguration 中。
  • TouchInputMapper.mViewport 會設為與 InputDevice.location 指定的通訊埠相符的可視區域。
  • 如果對應檔案中指定了輸入裝置埠,但目前沒有任何檢視區有相符的顯示埠,則該埠上的輸入裝置會停用。
  • 如果未為特定輸入裝置指定通訊埠,系統會根據現有規則設定視區。
  • 輸入驅動程式不需要進行任何核心變更。
  • 系統會使用 EVIOCGPHYS ioctl 判斷輸入裝置通訊埠。