In Android 9 und niedrigeren Versionen war es nicht möglich, per Touch mit mehreren Displays zu interagieren, da es keinen Zuordnungsmechanismus zwischen Displays und Eingabegeräten gab. Ein Touchscreen-Display konnte beispielsweise eine HDMI-Videoausgabe (die in Android als Display registriert wurde) und eine USB-Ausgabe für den Touchscreen (die als Eingabegerät registriert wurde) bieten. Wenn mehrere Geräte auf diese Weise verbunden waren, konnte 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 Displayportwerte 1 und
2 sein. Die Portwerte bleiben gleich, auch wenn ein anderes Display (z. B. ein anderes Displaymodell oder ein anderer Hersteller) an denselben physischen HDMI-Anschluss angeschlossen wird. So können Gerätehersteller Anleitungen zum Zusammenbauen und Aufrüsten von Displays bereitstellen.
Die Zuordnung 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 das Display angeschlossen 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 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 Array RecentQueue im Status des Eingabe-Dispatchers zu prüfen. So können Sie die Geräte identifizieren, die das letzte Ereignis generiert haben. Anschließend können Sie das entsprechende Gerät im Event Hub-Status suchen.
Verwenden Sie adb shell dumpsys display, um die Displayports zu ermitteln, die den angeschlossenen Displays zugewiesen sind, und suchen Sie dann unter „Display Devices“ (Displaygeräte) für jedes Display nach der Eigenschaft address von DisplayDeviceInfo.
Alternativ können Sie mit adb shell dumpsys SurfaceFlinger --display-id Informationen zur Identifizierung aller angeschlossenen Displays ausgeben. Weitere Informationen finden Sie unter
Statische Display-IDs.
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 Zuordnung erfolgt nur für Touchgeräte.
Routing für dynamische Multi-Displays
In Android 10 können Sie statische Multi-Display-Geräte einrichten. Dynamische Zuordnungen sind noch nicht aktiviert. Einige Anwendungsfälle können jedoch berücksichtigt werden, indem Routinginformationen für Displays und Eingabefelder bereitgestellt werden, die nicht immer vorhanden sind, oder indem virtuelle Eingabegeräte verwendet und diesen virtuellen Geräten zusätzliche Routinginformationen zur Verfügung gestellt werden. Wenn eine Geräteimplementierung Folgendes unterstützt:
- Desktopähnliche Nutzung mit einer Dockingstation: In diesem Fall kann eine Routingkonfiguration bereitgestellt werden, um die Eingabe von einem Eingabezubehör, das mit der Dockingstation verbunden ist (eindeutig durch den Port identifiziert), an das externe Display weiterzuleiten (durch den Port identifiziert).
- Primärer Bildschirm, der als Eingabequelle (z. B. als Touchpad) fungiert, wenn er mit dem externen Display verbunden ist: In diesem Fall kann eine Routingkonfiguration bereitgestellt werden, um die Eingabe vom virtuellen Touchpanel (durch die eindeutige virtuelle ID identifiziert) an das externe Display weiterzuleiten (durch den Port identifiziert).
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
InputReaderConfigurationgespeichert. TouchInputMapper.mViewportist auf den Darstellungsbereich festgelegt, der dem fürInputDevice.locationangegebenen Port entspricht.- Wenn in der Zuordnungsdatei ein Port für ein Eingabegerät angegeben ist und derzeit kein Darstellungsbereich mit einem entsprechenden Displayport vorhanden ist, wird das Eingabegerät an diesem Port deaktiviert.
- Wenn für ein bestimmtes Eingabegerät kein Port angegeben ist, wird der Darstellungsbereich gemäß den bestehenden Regeln festgelegt.
- In den Eingabetreibern sind keine Kerneländerungen erforderlich.
- Die Ports der Eingabegeräte werden mit dem EVIOCGPHYS-ioctl ermittelt.