В 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 State.
adb shell dumpsys input
Если подключено много устройств, нажмите на определенное устройство, чтобы проверить массив RecentQueue
в Input Dispatcher State. Затем вы можете определить те устройства, которые сгенерировали самое последнее событие. Затем вы можете найти соответствующее устройство в Event Hub State.
Чтобы определить порты дисплея, назначенные подключенным дисплеям, используйте adb shell dumpsys display
, а затем найдите свойство address
DisplayDeviceInfo
для каждого дисплея в разделе Display Devices. В качестве альтернативы используйте adb shell dumpsys SurfaceFlinger --display-id
для дампа идентификационной информации для всех подключенных дисплеев. См. также Статические идентификаторы дисплеев .
Если вы указываете ассоциацию для определенного устройства ввода, а соответствующий дисплей отсутствует в системе, устройство ввода отключается до тех пор, пока не появится соответствующий дисплей. Ассоциация выполняется только для сенсорных устройств.
Маршрутизация для динамических мультидисплеев
Android 10 позволяет вам настраивать статические многодисплейные устройства. Динамические ассоциации пока не включены. Однако некоторые варианты использования можно решить, предоставив информацию о маршрутизации для дисплеев и панелей ввода, которые не всегда присутствуют, или используя виртуальные устройства ввода, а затем предоставив дополнительную информацию о маршрутизации этим виртуальным устройствам. Если реализация устройства поддерживает:
- Аналогично настольному компьютеру с док-станцией, можно настроить конфигурацию маршрутизации для направления входных данных от устройства ввода, подключенного к док-станции (идентифицируемого уникальным портом), на внешний дисплей (идентифицируемый портом).
- Основной экран выступает в качестве источника ввода (например, сенсорная панель) при подключении к внешнему дисплею, затем может быть предоставлена конфигурация маршрутизации для направления ввода с виртуальной сенсорной панели (идентифицируемой уникальным виртуальным идентификатором) на внешний дисплей (идентифицируемый портом).
Выполнение
- Для физических устройств порт, к которому подключено устройство ввода, и порт, к которому подключен дисплей, используются для согласования дисплеев с сенсорными экранами.
- Сопоставления хранятся в
InputReaderConfiguration
. -
TouchInputMapper.mViewport
устанавливается на область просмотра, которая соответствует порту, указанному дляInputDevice.location
. - Если порт устройства ввода указан в файле сопоставления, а в данный момент нет области просмотра с соответствующим портом отображения, то устройство ввода на этом порту отключается.
- Если для конкретного устройства ввода порт не указан, то область просмотра устанавливается в соответствии с существующими правилами.
- Никаких изменений в ядре входных драйверов не требуется.
- Порты входных устройств определяются с помощью ioctl EVIOCGPHYS.