W Androidzie 9 i starszych wersjach nie można było wchodzić w interakcję z wieloma wyświetlaczami za pomocą dotyku, ponieważ nie było mechanizmu powiązania wyświetlaczy z urządzeniami wejściowymi. Na przykład ekran dotykowy może mieć wyjście wideo HDMI (które będzie rejestrowane w Androidzie jako wyświetlacz) i wyjście USB dla ekranu dotykowego (które będzie rejestrowane jako urządzenie wejściowe). Jeśli w ten sposób podłączono kilka urządzeń, nie można określić, które urządzenie wejściowe należy do którego wyświetlacza. Ten sam problem dotyczy urządzeń składanych z kilkoma wbudowanymi wyświetlaczami.
W Androidzie 10 dodano mechanizm określania, które urządzenia wejściowe należą do których wyświetlaczy. Powiązanie jest tworzone na podstawie numerów portów, gdzie port odnosi się do fizycznego portu, do którego podłączony jest wyświetlacz.
Jeśli na przykład urządzenie z Androidem ma 2 porty HDMI oznaczone jako hdmi1 i hdmi2, wartości portu wyświetlacza mogą wynosić 1 i 2. Wartości portów pozostają takie same nawet wtedy, gdy do tego samego fizycznego portu HDMI podłączony jest inny wyświetlacz (np. inny model lub producent). Umożliwia to producentom urządzeń dostarczanie instrukcji montażu i modernizacji wyświetlaczy.
Powiązanie jest skonfigurowane w /vendor/etc/input-port-associations.xml.
Przykład:
<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>W powyższym przykładzie display="0" określa port, do którego jest podłączony wyświetlacz. input="usb-xhci-hcd.0.auto-1.1/input0"
określa port, do którego podłączone jest urządzenie wejściowe. Aby określić porty
powiązane z określonymi urządzeniami, użyj tego polecenia terminala, a potem sprawdź właściwośćlocation tych urządzeń w stanie Event Hub.
adb shell dumpsys input
Jeśli jest połączonych wiele urządzeń, kliknij konkretne urządzenie, aby sprawdzić tablicę RecentQueue w sekcji Input Dispatcher State (Stan dyspozytora wejść). Następnie możesz zidentyfikować urządzenia, które wygenerowały ostatnie zdarzenie. Następnie możesz znaleźć odpowiednie urządzenie w sekcji Stan Centrum zdarzeń.
Aby określić porty wyświetlania przypisane do podłączonych wyświetlaczy, użyj polecenia
adb shell dumpsys display, a następnie poszukaj właściwości address
DisplayDeviceInfo dla każdego wyświetlacza w sekcji Urządzenia wyświetlające.
Możesz też użyć polecenia adb shell dumpsys SurfaceFlinger --display-id, aby zrzucić informacje identyfikacyjne wszystkich podłączonych wyświetlaczy. Zobacz też Identyfikatory reklam displayowych statycznych.
Jeśli określisz powiązanie dla konkretnego urządzenia wejściowego, a odpowiedni wyświetlacz nie jest obecny w systemie, urządzenie wejściowe zostanie wyłączone do czasu pojawienia się odpowiedniego wyświetlacza. Powiązanie jest wykonywane tylko w przypadku urządzeń dotykowych.
Routing w przypadku dynamicznych wyświetlaczy wieloekranowych
Android 10 umożliwia konfigurowanie statycznych urządzeń z wieloma wyświetlaczami. Dynamiczne powiązania nie są jeszcze włączone. W niektórych przypadkach można jednak podać informacje o kierowaniu w przypadku wyświetlaczy i paneli wejściowych, które nie są zawsze obecne, lub użyć wirtualnych urządzeń wejściowych, a następnie podać dodatkowe informacje o kierowaniu do tych wirtualnych urządzeń. Jeśli implementacja urządzenia obsługuje:
- Jeśli urządzenie jest używane jak komputer stacjonarny z stacją dokowania, można podać konfigurację routingu, aby kierować dane wejściowe z akcesorium wejściowego podłączonego do stacji dokowania (identyfikowanego jednoznacznie przez port) na wyświetlacz zewnętrzny (identyfikowany przez port).
- Gdy ekran główny jest podłączony do wyświetlacza zewnętrznego, może pełnić funkcję źródła sygnału (np. touchpada). W takim przypadku można podać konfigurację routingu, aby kierować dane wejściowe z wirtualnego panelu dotykowego (identyfikowanego przez unikalny wirtualny identyfikator) na wyświetlacz zewnętrzny (identyfikowany przez port).
Implementacja
- W przypadku urządzeń fizycznych port, do którego podłączone jest urządzenie wejściowe, oraz port, do którego podłączony jest wyświetlacz, służą do dopasowywania wyświetlaczy do ekranów dotykowych.
- Mapowania są przechowywane w pliku
InputReaderConfiguration. TouchInputMapper.mViewportjest ustawiony na widoczny obszar, który pasuje do portu określonego dlaInputDevice.location.- Jeśli w pliku mapowania określono port urządzenia wejściowego, a obecnie nie ma widocznego obszaru z pasującym portem wyświetlacza, urządzenie wejściowe podłączone do tego portu jest wyłączone.
- Jeśli port nie jest określony dla konkretnego urządzenia wejściowego, widok jest ustawiany zgodnie z obowiązującymi regułami.
- W sterownikach wejściowych nie są wymagane żadne zmiany w jądrze.
- Porty urządzenia wejściowego są określane za pomocą ioctl EVIOCGPHYS.