В Android 9 и более ранних версиях не было возможности взаимодействовать с несколькими дисплеями с помощью сенсорного экрана, поскольку отсутствовал механизм сопоставления между дисплеями и устройствами ввода. Например, сенсорный экран мог выводить видеосигнал через HDMI (который регистрировался бы как дисплей в Android) и через USB для сенсорного экрана (который регистрировался бы как устройство ввода). Если таким образом было подключено несколько устройств, невозможно было определить, какое устройство ввода относится к какому дисплею. Та же проблема существует и для складных устройств с несколькими встроенными дисплеями.
В Android 10 добавлен механизм, позволяющий указывать, какие устройства ввода относятся к каким дисплеям. Сопоставление осуществляется по номерам портов, где порт обозначает физический порт, к которому подключен дисплей.
Например, если у устройства Android есть два порта HDMI с маркировкой hdmi1 и hdmi2 , то значения портов дисплея могут быть 1 и 2 Значения портов остаются неизменными даже при подключении к тому же физическому порту HDMI другого дисплея (например, другой модели или производителя). Это позволяет производителям устройств предоставлять инструкции по сборке и модернизации дисплеев.
Настройка связи осуществляется в /vendor/etc/input-port-associations.xml . Например:
<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> В приведенном выше примере display="0" указывает порт, к которому подключен дисплей. input="usb-xhci-hcd.0.auto-1.1/input0" указывает порт, к которому подключено устройство ввода. Чтобы определить порты, связанные с конкретными устройствами, используйте следующую команду в терминале, а затем просмотрите свойство location этих устройств в состоянии Event Hub.
adb shell dumpsys input
Если подключено много устройств, коснитесь конкретного устройства, чтобы просмотреть массив RecentQueue в состоянии Input Dispatcher. Затем вы сможете определить устройства, которые сгенерировали последнее событие. После этого вы сможете найти соответствующее устройство в состоянии Event Hub.
Чтобы определить порты дисплея, назначенные подключенным дисплеям, используйте adb shell dumpsys display , а затем найдите свойство address объекта ` DisplayDeviceInfo для каждого дисплея в разделе `Display Devices`. В качестве альтернативы используйте adb shell dumpsys SurfaceFlinger --display-id чтобы вывести идентификационную информацию для всех подключенных дисплеев. См. также раздел «Статические идентификаторы дисплеев» .
Если вы указываете связь с конкретным устройством ввода, а соответствующий дисплей отсутствует в системе, устройство ввода отключается до тех пор, пока не появится соответствующий дисплей. Связь устанавливается только для сенсорных устройств.
Маршрутизация для динамических многоэкранных систем
Android 10 позволяет настраивать статические устройства с несколькими дисплеями. Динамические ассоциации пока не включены. Однако некоторые сценарии использования можно решить, предоставив информацию о маршрутизации для дисплеев и панелей ввода, которые не всегда присутствуют, или используя виртуальные устройства ввода, а затем предоставив дополнительную информацию о маршрутизации этим виртуальным устройствам. Если реализация устройства поддерживает:
- Для обеспечения удобства работы, аналогичного настольному компьютеру, с помощью док-станции можно настроить маршрутизацию, чтобы направлять входной сигнал от подключенного к док-станции устройства (идентифицируемого по порту) на внешний дисплей (идентифицируемый по порту).
- При подключении к внешнему дисплею основной экран выступает в качестве источника ввода (например, сенсорная панель), после чего можно задать конфигурацию маршрутизации для передачи ввода с виртуальной сенсорной панели (идентифицируемой уникальным виртуальным идентификатором) на внешний дисплей (идентифицируемый портом).
Выполнение
- В случае физических устройств порт, к которому подключено устройство ввода, и порт, к которому подключен дисплей, используются для согласования дисплеев с сенсорными экранами.
- Сопоставления хранятся в
InputReaderConfiguration. -
TouchInputMapper.mViewportустанавливается в значение viewport, соответствующее порту, указанному дляInputDevice.location. - Если в файле сопоставления указан порт устройства ввода, и в данный момент нет области просмотра, имеющей соответствующий порт дисплея, то устройство ввода на этом порту отключается.
- Если для конкретного устройства ввода не указан порт, то область просмотра устанавливается в соответствии с существующими правилами.
- Никаких изменений в драйверах ввода в ядре не требуется.
- Порты входных устройств определяются с помощью команды ioctl EVIOCGPHYS.