ADB: Как программно определить, какое устройство ввода используется для отправки сенсорного события с помощью sendevent - PullRequest
0 голосов
/ 17 января 2019

Я пытаюсь программно определить, какое устройство ввода мне нужно использовать для отправки сенсорных событий (например, касаний, пролистываний и т. Д.) С помощью команды sendevent оболочки adb. Sendevent оболочки adb ожидает устройства ввода, куда оно будет отправлять событие. Пример: "adb shell sendevent / dev / input / event4: 0003 0035 000003b4". Проблема, с которой я сталкиваюсь, заключается в том, что часть «event4» зависит от используемого устройства (телефона, планшета и т. Д.) (Это может быть «event0», «event1» и т. Д.), Поэтому мне нужен способ определить, какое устройство ввода мне нужно использовать для отправки сенсорных событий.

Вещи, которые я пробовал: Android: программно определяет, подключено ли устройство к сенсорному экрану Предложенный ответ работает не во всех случаях, поскольку используемое ими поле «Имя» также зависит от устройства и может не всегда включать «Сенсорный», и ни одно из других свойств, используемых в этом ответе, похоже, не соответствует сенсорному устройству.

Использование dumpsys input. Эта команда дает различные устройства ввода, которые может иметь устройство Android, однако, опять же, ни одно из полей, казалось, не соответствует тому, какое из них является сенсорным устройством.

Использование getevent и моделирование крана с помощью input tap <x> <y>. Команда getevent также перечисляет различные устройства ввода, и при обнаружении события, такого как касание, выводит что-то очень похожее на то, что я хочу. Пример

add device 1: /dev/input/event4
  name:     "Genymotion Virtual Input"
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 2: /dev/input/event3
  name:     "VirtualBox mouse integration"
add device 3: /dev/input/event1
  name:     "Sleep Button"
add device 4: /dev/input/event0
  name:     "Power Button"
add device 5: /dev/input/event2
  name:     "AT Translated Set 2 keyboard"
could not get driver version for /dev/input/mice, Not a typewriter
[    6670.964258] /dev/input/event4: 0001 014a 00000001
[    6670.964258] /dev/input/event4: 0003 003a 00000001
[    6670.964258] /dev/input/event4: 0003 0035 000003b4
[    6670.964258] /dev/input/event4: 0003 0036 000004e2
[    6670.964258] /dev/input/event4: 0000 0002 00000000
[    6670.964258] /dev/input/event4: 0000 0000 00000000
[    6671.027772] /dev/input/event4: 0003 0035 000003b3
[    6671.027772] /dev/input/event4: 0003 0036 000004df
[    6671.027772] /dev/input/event4: 0000 0002 00000000
[    6671.027772] /dev/input/event4: 0000 0000 00000000
[    6671.041099] /dev/input/event4: 0001 014a 00000000
[    6671.041099] /dev/input/event4: 0000 0002 00000000
[    6671.041099] /dev/input/event4: 0000 0000 00000000

Однако команда input tap <x> <y> по какой-то причине не запускает какой-либо вывод команды getevent (я предполагаю, что это ожидается, хотя я не могу найти никаких ссылок, поддерживающих это). И единственный способ для меня запустить любой из выходных данных команды getevent, по-видимому, требует от меня использования команды sendevent, но для этого мне уже нужно знать устройство ввода.

Кроме того, предполагается, что это не требует какого-либо вмешательства со стороны пользователя, поэтому им не нужно выполнять касания или самостоятельно подавать на устройство ввода. Он должен быть полностью автономным.

Любая помощь с этим будет принята с благодарностью. Спасибо.

1 Ответ

0 голосов
/ 18 января 2019

Благодаря @AlexP. за соответствующую ссылку на команду getevent -pl. Ответ SO, который он связал, не работал для меня полностью, поэтому мне пришлось немного его изменить. Это тот, который, кажется, работает для меня.

getevent -pl | awk 'BEGIN { RS="add device "; } /^[0-9]/ { print RS $0; }' | grep -B 100 ABS_MT_POSITION_X | awk '/add device/ {print $NF}'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...