【问题标题】:ADB: How to programmatically determine which input device is used for sending touch event with sendeventADB:如何通过 sendevent 以编程方式确定用于发送触摸事件的输入设备
【发布时间】:2023-04-10 03:08:02
【问题描述】:

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

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

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

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

对此的任何帮助将不胜感激。谢谢。

【问题讨论】:

  • 感谢@AlexP。他们给出的命令对我来说并不完全有效,但是,我能够制作自己的 getevent -pl info 解析器,它对我有用。

标签: android adb


【解决方案1】:

感谢@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}'

【讨论】:

  • 有些设备不包含awkgrepsed等工具,因此可能需要在adb shell之外进行解析。
猜你喜欢
  • 1970-01-01
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2011-01-01
  • 1970-01-01
相关资源
最近更新 更多