Eingaberouting

Unter Android 9 und niedriger gab es keine Möglichkeit, mit mehreren Displays zu interagieren. über Touchbedienung, da es keinen Verknüpfungsmechanismus zwischen Anzeige und Eingabe gab. Geräte. Ein Touchscreen-Display bietet beispielsweise einen HDMI-Videoausgang. (die auf Android-Geräten als Display registriert werden) und einen USB-Ausgang für den Touchscreen. (das als Eingabegerät registriert wird). Wenn mehrere Geräte verbunden waren, Auf diese Weise gäbe es keine Möglichkeit festzustellen, zu welchem Eingabegerät welches Display verwendet wird. Dasselbe Problem gilt für faltbare Geräte mit mehreren angezeigt wird.

Unter Android 10 wurde ein Mechanismus hinzugefügt, mit dem angegeben wird, welche Eingabe zu welchen Displays gehören. Die Verknüpfung erfolgt über Portnummern, port ist der physische Port, mit dem ein Bildschirm verbunden ist.

Beispiel: Wenn ein Android-Gerät zwei HDMI-Ports mit der Bezeichnung hdmi1 hat und hdmi2, könnten die Werte für den Anzeigeport 1 und 2. Die Portwerte bleiben gleich, auch wenn eine andere Anzeige (z. B. ein anderes Displaymodell oder ein anderer Hersteller) HDMI-Anschluss. So können Gerätehersteller eine Anleitung zum Zusammenbauen und Upgrades von Bildschirmen.

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, an den der Display verbunden ist. input="usb-xhci-hcd.0.auto-1.1/input0" gibt den Port an, mit dem das Eingabegerät verbunden ist. So ermitteln Sie die Ports: die mit bestimmten Geräten verknüpft sind, verwenden Sie den folgenden Terminalbefehl und Prüfen Sie die location-Eigenschaft dieser Geräte im Ereignis-Hub-Status.

adb shell dumpsys input

Wenn viele Geräte verbunden sind, tippen Sie auf ein bestimmtes Gerät, um die RecentQueue-Array im Eingabe-Dispatcher-Status. Sie können dann ermitteln, die Geräte, die das letzte Ereignis generiert haben. Dort finden Sie die entsprechendes Gerät im Ereignis-Hub-Status aus.

Um die Anzeigeports zu ermitteln, die den verbundenen Bildschirmen zugewiesen sind, verwenden Sie adb shell dumpsys display und suche dann nach address DisplayDeviceInfo für jede Anzeige unter "Geräte anzeigen". Alternativ können Sie für den Dump adb shell dumpsys SurfaceFlinger --display-id verwenden. Identifizierungsinformationen für alle verbundenen Bildschirme. Siehe auch Statische Display-IDs:

Wenn Sie eine Verknüpfung für ein bestimmtes Eingabegerät und das entsprechende nicht vorhanden ist, wird das Eingabegerät deaktiviert, bis das entsprechende angezeigt wird. Die Verknüpfung wird nur für Touchscreen-Geräte durchgeführt.

Routing für dynamische Multi-Display-Anzeigen

Mit Android 10 kannst du statische Multi-Display-Anzeigen einrichten, Geräte. Dynamische Verknüpfungen sind noch nicht aktiviert. Einige Anwendungsfälle können jedoch indem Routeninformationen für Bildschirme und Eingabefelder bereitgestellt werden, immer vorhanden sind oder virtuelle Eingabegeräte verwenden und dann zusätzliche Routing-Informationen mit diesen virtuellen Geräten verbunden ist. Wenn eine Geräteimplementierung Folgendes unterstützt:

  • Desktop-ähnliche Umgebung mit einer Dockingstation, könnte eine Routing-Konfiguration zur Zieleingabe vom mit dem Dock verbundenen Eingabezubehör (identifiziert) eindeutig durch Port) an den externen Bildschirm (gekennzeichnet durch Port) übertragen.
  • Primärer Bildschirm, der bei Verbindung als Eingabequelle dient (z. B. Touchpad) an das externe Display übergeben, kann eine Routingkonfiguration für die Zieleingabe bereitgestellt werden. vom virtuellen Touchscreen (identifiziert durch die eindeutige virtuelle ID) zum externen Display (gekennzeichnet durch Port).

Implementierung

  • Bei physischen Geräten: der Port, mit dem das Eingabegerät verbunden ist, und der Port, an den der Bildschirm angeschlossen ist, werden verwendet, um die Displays mit Touchscreens abzugleichen.
  • Die Zuordnungen werden in InputReaderConfiguration gespeichert.
  • TouchInputMapper.mViewport ist auf den Darstellungsbereich festgelegt, der mit den für InputDevice.location angegebenen Port.
  • Wenn in der Zuordnungsdatei ein Port für das Eingabegerät angegeben ist und es keinen Darstellungsbereich mit einem übereinstimmenden Displayport hat, wird die Eingabe Gerät an diesem Anschluss deaktiviert ist.
  • Wenn für ein bestimmtes Eingabegerät kein Port angegeben ist, wird der Darstellungsbereich die den vorhandenen Regeln entspricht.
  • In den Eingabetreibern sind keine Kernel-Änderungen erforderlich.
  • Die Ports des Eingabegeräts werden mit der EVIOCGPHYS-IOctl bestimmt.