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 między wyświetlaczami a 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 połą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
.
Na 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 podłączony jest 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 konkretnymi urządzeniami, użyj tego polecenia terminala, a następnie 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 danych wejściowych). Dzięki temu 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 statycznych.
Jeśli określisz powiązanie dla konkretnego urządzenia wejściowego, a odpowiedni wyświetlacz nie będzie 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 do 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 użyciem stacji dokującej, można podać konfigurację routingu, aby kierować dane wejściowe z akcesorium wejściowego podłączonego do stacji dokującej (identyfikowanego jednoznacznie przez port) na wyświetlacz zewnętrzny (identyfikowany przez port).
- gdy ekran główny działa jako źródło danych wejściowych (np. touchpad) po podłączeniu do wyświetlacza zewnętrznego, 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.mViewport
jest ustawiony na widoczny obszar, który pasuje do portu określonego dla parametruInputDevice.location
.- Jeśli w pliku mapowania określono port urządzenia wejściowego, a obecnie nie ma obszaru wyświetlania 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, widoczny obszar 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.