Unter Android 9 und niedriger war es nicht möglich, mehrere Displays per Touch zu bedienen, da es keinen Mechanismus zur Verknüpfung von Displays und Eingabegeräten gab. Ein Touchscreen kann beispielsweise einen HDMI-Videoausgang (der in Android als Display registriert wird) und einen USB-Ausgang für den Touchscreen (der als Eingabegerät registriert wird) haben. Wenn mehrere Geräte auf diese Weise verbunden wären, könnte nicht ermittelt werden, welches Eingabegerät zu welchem Display gehört. Dasselbe Problem gilt für faltbare Geräte mit mehreren integrierten Displays.
In Android 10 wurde ein Mechanismus hinzugefügt, mit dem angegeben werden kann, welche Eingabegeräte zu welchen Displays gehören. Die Zuordnung erfolgt über Portnummern, wobei sich Port auf den physischen Port bezieht, an den ein Display angeschlossen ist.
Wenn ein Android-Gerät beispielsweise zwei HDMI-Anschlüsse mit den Bezeichnungen hdmi1
und hdmi2
hat, können die Werte für den Display-Port 1
und 2
sein. Die Portwerte bleiben gleich, auch wenn ein anderer Bildschirm (z. B. ein anderes Modell oder ein anderer Hersteller) an denselben physischen HDMI‑Port angeschlossen wird. So können Gerätehersteller Anleitungen zum Zusammenbauen und Aktualisieren von Displays bereitstellen.
Die Verknüpfung wird in /vendor/etc/input-port-associations.xml
konfiguriert.
Beispiel:
<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>
Im obigen Beispiel gibt display="0"
den Port an, mit dem das Display verbunden ist. input="usb-xhci-hcd.0.auto-1.1/input0"
gibt den Port an, an den das Eingabegerät angeschlossen ist. Verwenden Sie den folgenden Terminalbefehl, um die Ports zu ermitteln, die bestimmten Geräten zugeordnet sind, und sehen Sie sich dann die Eigenschaft location
dieser Geräte im Event Hub-Status an.
adb shell dumpsys input
Wenn viele Geräte verbunden sind, tippen Sie auf ein bestimmtes Gerät, um das RecentQueue
-Array im Input Dispatcher State zu untersuchen. Anschließend können Sie die Geräte ermitteln, die das letzte Ereignis ausgelöst haben. Das entsprechende Gerät finden Sie dann im Event Hub-Status.
Verwenden Sie adb shell dumpsys display
, um die den angeschlossenen Displays zugewiesenen Display-Ports zu ermitteln, und suchen Sie dann unter „Display Devices“ für jedes Display nach der Eigenschaft address
von DisplayDeviceInfo
.
Alternativ können Sie mit adb shell dumpsys SurfaceFlinger --display-id
Identifikationsinformationen für alle angeschlossenen Displays ausgeben. Siehe auch Kennungen für statische Displays.
Wenn Sie eine Zuordnung für ein bestimmtes Eingabegerät angeben und das entsprechende Display nicht im System vorhanden ist, wird das Eingabegerät deaktiviert, bis das entsprechende Display angezeigt wird. Die Verknüpfung erfolgt nur für Touch-Geräte.
Routing für dynamische Multi-Displays
Mit Android 10 können Sie statische Geräte mit mehreren Displays einrichten. Dynamische Verknüpfungen sind noch nicht aktiviert. Einige Anwendungsfälle können jedoch durch die Bereitstellung von Routing-Informationen für Displays und Eingabefelder, die nicht immer vorhanden sind, oder durch die Verwendung virtueller Eingabegeräte und die anschließende Bereitstellung zusätzlicher Routing-Informationen für diese virtuellen Geräte abgedeckt werden. Wenn eine Geräteimplementierung Folgendes unterstützt:
- Wenn Sie beispielsweise eine Desktop-ähnliche Umgebung mit einer Dockingstation nutzen, kann eine Routingkonfiguration bereitgestellt werden, um die Eingabe von einem Eingabezubehör, das mit dem Dock verbunden ist (eindeutig durch den Port identifiziert), an das externe Display (durch den Port identifiziert) weiterzuleiten.
- Wenn der primäre Bildschirm als Eingabequelle (z. B. ein Touchpad) fungiert, wenn er mit dem externen Display verbunden ist, kann eine Routingkonfiguration bereitgestellt werden, um Eingaben vom virtuellen Touchpanel (identifiziert durch eine eindeutige virtuelle ID) an das externe Display (identifiziert durch den Port) zu senden.
Implementierung
- Bei physischen Geräten werden der Port, an den das Eingabegerät angeschlossen ist, und der Port, an den das Display angeschlossen ist, verwendet, um die Displays mit Touchscreens abzugleichen.
- Die Zuordnungen werden in
InputReaderConfiguration
gespeichert. TouchInputMapper.mViewport
ist auf den Darstellungsbereich festgelegt, der dem fürInputDevice.location
angegebenen Port entspricht.- Wenn in der Zuordnungsdatei ein Eingabegeräteanschluss angegeben ist und derzeit kein Darstellungsbereich mit einem passenden Displayanschluss vorhanden ist, wird das Eingabegerät an diesem Anschluss deaktiviert.
- Wenn für ein bestimmtes Eingabegerät kein Port angegeben ist, wird der Viewport gemäß den vorhandenen Regeln festgelegt.
- In den Eingabetreibern sind keine Kerneländerungen erforderlich.
- Die Ports des Eingabegeräts werden mit dem ioctl EVIOCGPHYS ermittelt.