Dans Android 9 et les versions antérieures, il n'était pas possible d'interagir avec plusieurs écrans via le toucher, car il n'existait aucun mécanisme d'association entre les écrans et les périphériques d'entrée. Par exemple, un écran tactile peut fournir une sortie vidéo HDMI (qui s'enregistre en tant qu'écran sur Android) et une sortie USB pour l'écran tactile (qui s'enregistre en tant que périphérique d'entrée). Si plusieurs appareils étaient connectés de cette manière, il serait impossible de déterminer quel périphérique d'entrée appartient à quel écran. Le même problème s'applique aux appareils pliables dotés de plusieurs écrans intégrés.
Android 10 a ajouté un mécanisme permettant de spécifier les périphériques d'entrée appartenant à chaque écran. L'association se fait par numéro de port, où port fait référence au port physique auquel un écran est connecté.
Par exemple, si un appareil Android dispose de deux ports HDMI nommés hdmi1
et hdmi2
, les valeurs de port d'affichage peuvent être 1
et 2
. Les valeurs des ports restent les mêmes, même lorsqu'un autre écran (par exemple, un modèle ou un fabricant différents) est connecté au même port HDMI physique. Les fabricants d'appareils peuvent ainsi fournir des instructions pour assembler et mettre à niveau les écrans.
L'association est configurée dans /vendor/etc/input-port-associations.xml
.
Exemple :
<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>
Dans l'exemple ci-dessus, display="0"
spécifie le port auquel l'écran est connecté. input="usb-xhci-hcd.0.auto-1.1/input0"
spécifie le port auquel le périphérique d'entrée est connecté. Pour déterminer les ports associés à des appareils spécifiques, utilisez la commande de terminal suivante, puis examinez la propriété location
de ces appareils dans l'état Event Hub.
adb shell dumpsys input
Si plusieurs appareils sont connectés, appuyez sur un appareil spécifique pour examiner le tableau RecentQueue
dans l'état Input Dispatcher. Vous pouvez ensuite identifier les appareils qui ont généré l'événement le plus récent. Vous pouvez ensuite trouver l'appareil correspondant dans l'état Event Hub.
Pour déterminer les ports d'affichage attribués aux écrans connectés, utilisez adb shell dumpsys display
, puis recherchez la propriété address
de DisplayDeviceInfo
pour chaque écran sous "Display Devices" (Périphériques d'affichage).
Vous pouvez également utiliser adb shell dumpsys SurfaceFlinger --display-id
pour vider les informations d'identification de tous les écrans connectés. Consultez également Identifiants d'affichage statique.
Si vous spécifiez une association pour un périphérique d'entrée spécifique et que l'écran correspondant n'est pas présent dans le système, le périphérique d'entrée est désactivé jusqu'à ce que l'écran respectif apparaisse. L'association n'est effectuée que pour les appareils tactiles.
Routage pour les écrans multiples dynamiques
Android 10 vous permet de configurer des appareils multi-écran statiques. Les associations dynamiques ne sont pas encore activées. Toutefois, certains cas d'utilisation peuvent être résolus en fournissant des informations de routage pour les écrans et les panneaux de saisie qui ne sont pas toujours présents, ou en utilisant des périphériques d'entrée virtuels, puis en fournissant des informations de routage supplémentaires à ces périphériques virtuels. Si l'implémentation d'un appareil est compatible avec :
- Pour une expérience de type ordinateur de bureau avec une station d'accueil, une configuration de routage peut être fournie pour cibler l'entrée de l'accessoire d'entrée connecté à la station d'accueil (identifié de manière unique par port) vers l'écran externe (identifié par port).
- Si l'écran principal sert de source d'entrée (comme un pavé tactile) lorsqu'il est connecté à l'écran externe, une configuration de routage peut être fournie pour cibler l'entrée du panneau tactile virtuel (identifié par un ID virtuel unique) vers l'écran externe (identifié par un port).
Implémentation
- Pour les appareils physiques, le port auquel le périphérique d'entrée est connecté et le port auquel l'écran est connecté sont utilisés pour faire correspondre les écrans aux écrans tactiles.
- Les mappages sont stockés dans
InputReaderConfiguration
. TouchInputMapper.mViewport
est défini sur la fenêtre d'affichage qui correspond au port spécifié pourInputDevice.location
.- Si un port de périphérique d'entrée est spécifié dans le fichier de mappage et qu'il n'existe actuellement aucune fenêtre d'affichage avec un port d'écran correspondant, le périphérique d'entrée sur ce port est désactivé.
- Si aucun port n'est spécifié pour un périphérique d'entrée particulier, la fenêtre d'affichage est définie selon les règles existantes.
- Aucune modification du noyau n'est requise dans les pilotes d'entrée.
- Les ports du périphérique d'entrée sont déterminés à l'aide de l'ioctl EVIOCGPHYS.