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. Ekran dotykowy może na przykład zapewniać wyjście wideo HDMI (które będzie rejestrowane jako wyświetlacz na Androidzie) oraz wyjście USB dotykowego ekranu (które będzie rejestrowane jako urządzenie wejściowe). Jeśli w ten sposób połączysz kilka urządzeń, nie będzie można określić, które urządzenie wejściowe należy do którego wyświetlacza. Ten sam problem dotyczy składanych urządzeń 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 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 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 pliku /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 w terminalu, a następnie przejrzyj 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, otwórz adb shell dumpsys display
i poszukaj właściwości address
w przypadku DisplayDeviceInfo
dla każdego wyświetlacza w sekcji Urządzenia 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 odpowiednia wyświetlacz nie jest obecny w systemie, urządzenie wejściowe jest 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 przekierowywaniu 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 przekierowywaniu do tych wirtualnych urządzeń. Jeśli implementacja urządzenia obsługuje:
- Dostęp do funkcji podobnych do tych na komputerze z wykorzystaniem stacji dokującej, a potem konfiguracji routingu, aby kierować dane wejściowe 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 konkretnego urządzenia wejściowego, widok jest ustawiany zgodnie z dotychczasowymi regułami.
- Nie trzeba wprowadzać żadnych zmian w jądrze w sterownikach danych wejściowych.
- Porty urządzenia wejściowego są określane za pomocą ioctl EVIOCGPHYS.