ADB:如何以编程方式确定哪个输入设备用于使用 sendevent 发送触摸事件

ADB: How to programmatically determine which input device is used for sending touch event with sendevent

我正在尝试使用 adb shell 的 sendevent 命令以编程方式确定我需要使用哪个输入设备来发送触摸事件(即点击、滑动等)。 adb shell 的 sendevent 需要一个输入设备,它将在其中发送事件。示例:"adb shell sendevent /dev/input/event4: 0003 0035 000003b4"。我遇到的问题是 "event4" 部分取决于所使用的设备(phone、平板电脑等)(可能是 "event0"、"event1" 等),所以,我想要的是一种确定我需要使用哪个输入设备来发送触摸事件的方法。

我尝试过的事情: Android: Programmatically detect if device has hardware touchscreen connected 建议的答案并非在所有情况下都有效,因为他们使用的 "Name" 字段也取决于设备,并且可能并不总是包括该答案中使用的其他属性的 "Touch" 和 none与触摸设备关联。

使用dumpsys input。此命令给出了 android 设备可能具有的不同输入设备,但是,再次 none 字段似乎与触摸设备相关。

使用 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 命令,但要这样做我已经需要知道输入设备。

此外,这应该不需要用户部分的任何干预,因此,他们不需要执行点击或自己提供输入设备。它需要完全自主。

如有任何帮助,我们将不胜感激。谢谢。

感谢@AlexP。对于命令 getevent -pl 的相关 link。他 linked 的 SO 答案对我来说并不完全适用,因此,我不得不对其进行一些修改。这似乎对我有用。

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