Unter Android 9 und niedriger war es nicht möglich, über Touchbedienung mit mehreren Displays zu interagieren, da es keinen Verknüpfungsmechanismus zwischen Displays und Eingabegeräten gab. Ein Touchscreen-Display könnte beispielsweise einen HDMI-Videoausgang (der unter Android als Display registriert wird) und einen USB-Ausgang für den Touchscreen (der als Eingabegerät registriert wird) haben. Wenn auf diese Weise mehrere Geräte verbunden wären, gäbe es keine Möglichkeit festzustellen, welches Eingabegerät zu welchem Bildschirm 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, mit dem ein Bildschirm verbunden ist.
Wenn ein Android-Gerät beispielsweise zwei HDMI-Ports mit den Bezeichnungen hdmi1
und hdmi2
hat, könnten die Anzeigeportwerte 1
und 2
lauten. Die Portwerte bleiben gleich, auch wenn ein anderes Display (z. B. ein anderes Displaymodell oder ein anderes Herstellermodell) an denselben physischen HDMI-Port angeschlossen ist. So können Gerätehersteller eine Anleitung zum Zusammenbauen und Aufrüsten 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, mit dem das Eingabegerät verbunden ist. Um die mit bestimmten Geräten verknüpften Ports zu ermitteln, verwenden Sie den folgenden Terminalbefehl und prüfen Sie dann die Eigenschaft location
dieser Geräte im Event Hub-Status.
adb shell dumpsys input
Wenn mehrere Geräte verbunden sind, tippen Sie auf ein bestimmtes Gerät, um sich das Array RecentQueue
im Status des Eingangsabwicklers anzusehen. Anschließend können Sie die Geräte ermitteln, die das letzte Ereignis generiert haben. Sie finden das entsprechende Gerät dann im Ereignis-Hub-Status.
Wenn Sie die Anzeigeports ermitteln möchten, die den verbundenen Bildschirmen zugewiesen sind, verwenden Sie adb shell dumpsys display
. Suchen Sie dann unter „Anzeigegeräte“ nach dem Attribut address
von DisplayDeviceInfo
für jeden Bildschirm.
Alternativ können Sie mit adb shell dumpsys SurfaceFlinger --display-id
die Identifikationsinformationen für alle verbundenen Displays dumpen. Siehe auch Kennzeichnungen für statische Anzeigen.
Wenn Sie eine Verknüpfung 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 wird nur für Touchscreen-Geräte durchgeführt.
Routing für dynamische Multi-Displays
Unter Android 10 kannst du statische Multi-Display-Geräte einrichten. Dynamische Verknüpfungen sind noch nicht aktiviert. Einige Anwendungsfälle können jedoch durch die Bereitstellung von Routinginformationen für Displays und Eingabefelder, die nicht immer vorhanden sind, oder durch die Verwendung virtueller Eingabegeräte und die Bereitstellung zusätzlicher Routinginformationen für diese virtuellen Geräte angegangen werden. Wenn eine Geräteimplementierung Folgendes unterstützt:
- Bei einer Desktop-ähnlichen Nutzererfahrung mit einer Dockingstation kann eine Routingkonfiguration bereitgestellt werden, um Eingaben vom Eingabezubehör, das mit dem Dock verbunden ist (eindeutig anhand des Ports identifiziert), auf das externe Display (identifiziert durch Port) zu leiten.
- Wenn der Hauptbildschirm als Eingabequelle (z. B. ein Touchpad) dient, wenn er mit dem externen Display verbunden ist, kann eine Routingkonfiguration bereitgestellt werden, um die Eingabe vom virtuellen Touchpanel (identifiziert durch eine eindeutige virtuelle ID) an das externe Display (identifiziert durch den Port) weiterzuleiten.
Implementierung
- Bei physischen Geräten werden die Ports, an die das Eingabegerät und das Display angeschlossen sind, verwendet, um die Displays mit Touchscreens zuzuordnen.
- 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äteport angegeben ist und derzeit kein Darstellungsbereich mit einem übereinstimmenden Anzeigeport vorhanden ist, wird das Eingabegerät an diesem Port deaktiviert.
- Wenn für ein bestimmtes Eingabegerät kein Port angegeben ist, wird der Viewport gemäß den vorhandenen Regeln festgelegt.
- An den Eingabetreibern sind keine Kerneländerungen erforderlich.
- Die Ports der Eingabegeräte werden mit der EVIOCGPHYS-IOctl bestimmt.