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