Eingabe-Routing

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 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 Port den physischen Port bezeichnet, an den ein Display angeschlossen ist.

Wenn ein Android-Gerät beispielsweise zwei HDMI-Ports mit den Beschriftungen hdmi1 und hdmi2 hat, könnten die Displayport-Werte 1 und 2 sein. 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 Anleitungen zum Zusammenbau und zur Aufrüstung 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. 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 viele Geräte verbunden sind, tippen Sie auf ein bestimmtes Gerät, um das RecentQueue-Array im Status des Eingabe-Dispatchers zu prüfen. Anschließend können Sie die Geräte ermitteln, die das letzte Ereignis generiert haben. Das entsprechende Gerät finden Sie dann im Event Hub-Status.

Um die Displayports zu ermitteln, die den verbundenen Displays zugewiesen sind, verwenden Sie adb shell dumpsys display und suchen Sie dann unter „Displaygeräte“ für jedes Display nach der Eigenschaft address von DisplayDeviceInfo. 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 erfolgt nur für Touchgeräte.

Routing für dynamisches Multi-Display

Mit Android 10 können Sie statische Multi-Display-Geräte einrichten. Dynamische Verknüpfungen sind noch nicht aktiviert. Einige Anwendungsfälle können jedoch durch Angabe von Routinginformationen für Displays und Eingabefelder, die nicht immer vorhanden sind, oder durch Verwendung virtueller Eingabegeräte und anschließende Angabe zusätzlicher Routinginformationen für diese virtuellen Geräte berücksichtigt werden. Wenn eine Geräteimplementierung Folgendes unterstützt:

  • Wenn Sie mit einer Dockingstation ein Desktop-ähnliches Erlebnis haben möchten, kann eine Routingkonfiguration bereitgestellt werden, um die Eingabe von Eingabezubehör, das mit dem Dock verbunden ist (eindeutig durch den Anschluss identifiziert), an das externe Display (durch den Anschluss identifiziert) weiterzuleiten.
  • 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) zu leiten.

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ür InputDevice.location angegebenen Port entspricht.
  • Wenn in der Zuordnungsdatei ein Port für ein Eingabegerät angegeben ist und es derzeit keinen Darstellungsbereich mit einem übereinstimmenden Displayport gibt, 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 Eingabegeräteports werden mit dem EVIOCGPHYS-ioctl ermittelt.