W Androidzie 9 i starszych nie było możliwości interakcji z kilkoma wyświetlaczami za pomocą dotyku, ponieważ nie było mechanizmu powiązania między wyświetlaczami a urządzeniami wejściowymi. Wyświetlacz z ekranem dotykowym może na przykład mieć wyjście wideo HDMI (rejestrowane jako wyświetlacz w Androidzie) i wyjście USB dla ekranu dotykowego (które można zarejestrować jako urządzenie wejściowe). Gdyby wiele urządzeń zostało podłączonych w ten sposób, nie można by było stwierdzić, które z nich 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 umożliwiający określenie, które urządzenia wejściowe należą do których wyświetlaczy. Powiązanie odbywa się na podstawie numerów portów, gdzie port odnosi się do fizycznego portu, do którego jest podłączony wyświetlacz.
Jeśli na przykład urządzenie z Androidem ma 2 porty HDMI o nazwach hdmi1
i hdmi2
, wartości portu wyświetlacza mogą wynosić 1
i 2
. Wartości portu pozostają takie same, nawet jeśli do tego samego fizycznego portu HDMI podłączony jest inny wyświetlacz (np. inny model lub inny producent). Dzięki temu producenci urządzeń mogą udostępniać instrukcje montażu i uaktualniania wyświetlaczy.
Powiązanie jest skonfigurowane w usłudze /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 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 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 stanie modułu Input Dispatcher. Możesz wtedy zidentyfikować urządzenia, które wygenerowały ostatnie zdarzenie. Odpowiednie urządzenie znajdziesz w stanie Event Hub.
Aby określić porty wyświetlacza przypisane do podłączonych wyświetlaczy, użyj polecenia adb shell dumpsys display
, a potem w sekcji Urządzenia do wyświetlania znajdź właściwość address
o wartości DisplayDeviceInfo
dla każdego wyświetlacza.
Możesz też użyć polecenia adb shell dumpsys SurfaceFlinger --display-id
, aby wyświetlić informacje identyfikacyjne wszystkich połączonych wyświetlaczy. Zobacz też Identyfikatory statycznych wyświetleń.
Jeśli określisz powiązanie z konkretnym urządzeniem wejściowym, a odpowiadającego mu wyświetlacza nie będzie w systemie, urządzenie wejściowe będzie wyłączone, dopóki nie pojawi się odpowiedni wyświetlacz. Powiązanie jest wykonywane tylko w przypadku urządzeń dotykowych.
Routing dla dynamicznych wyświetlaczy
Android 10 umożliwia konfigurowanie statycznych urządzeń z wieloma wyświetlaczami. Powiązania dynamiczne nie są jeszcze włączone. Niektóre przypadki użycia można jednak rozwiązać, podając informacje o przekierowaniu do wyświetlaczy i paneli wejściowych, które nie są zawsze obecne, lub używając wirtualnych urządzeń wejściowych, a następnie podając dodatkowe informacje o przekierowaniu do tych wirtualnych urządzeń. Jeśli implementacja urządzenia obsługuje:
- Do obsługi funkcji podobnych do komputera z użyciem stacji dokującej można użyć konfiguracji routingu, aby kierować dane z urządzenia peryferyjnego podłączonego do stacji dokującej (identyfikowanego jednoznacznie przez port) na wyświetlacz zewnętrzny (identyfikowany przez port).
- Ekran główny pełniący funkcję źródła danych wejściowych (np. panel dotykowy) po podłączeniu do wyświetlacza zewnętrznego. W tym przypadku można podać konfigurację routingu, aby kierować dane wejściowe z wirtualnego panelu dotykowego (identyfikowanego za pomocą unikalnego identyfikatora wirtualnego) na wyświetlacz zewnętrzny (identyfikowany za pomocą portu).
Implementacja
- W przypadku urządzeń fizycznych porty, do których podłączone są urządzenia wejściowe i wyświetlacze, są używane do dopasowywania wyświetlaczy do ekranów dotykowych.
- Mapowania są przechowywane w pliku
InputReaderConfiguration
. TouchInputMapper.mViewport
jest ustawiony na widoczny obszar pasujący do portu określonego dlaInputDevice.location
.- Jeśli w pliku mapowania podano port urządzenia wejściowego, a obecnie nie ma widoku z odpowiednim portem wyświetlacza, urządzenie wejściowe na tym porcie jest wyłączone.
- Jeśli port nie jest określony dla danego urządzenia wejściowego, widoczny obszar jest ustawiany zgodnie z istniejącymi regułami.
- Sterowniki wejściowe nie wymagają wprowadzania zmian w jądrze.
- Porty urządzenia wejściowego są określane za pomocą ioctl EVIOCGPHYS.