如何使用ADB在Android上单独发送按键和按键事件?

时间:2016-05-26 12:09:40

标签: android shell adb

answered question about sending long presses on android,问题在于

  • 这些答案实际上都没有使用过时的API,有些API太新了
  • 我需要发送按键事件,之后才决定解除按键

从关于链接问题的最高投票答案开始,我有以下代码:

adb shell sendevent /dev/input/event2 1 172 1
adb shell sendevent /dev/input/event2 0  0 0
timeout 1
adb shell sendevent /dev/input/event2 1 172 0
adb shell sendevent /dev/input/event2 0 0 0

这些命令不起作用,答案的作者也没有说明命令的作用和原因。通过一些实验,我发现:

  • 必须是/dev/input/event0而不是event2
  • 更改任何数字都不会发生任何事情
  • adb shell sendevent /dev/input/event2 0 0 0是必需的。它做什么我不知道

现在我需要为密钥发送密钥上/下事件,包括那些不在设备上的密钥(例如KEYCODE_DPAD_DOWN),因此adb shell getevent没有'帮助那么多 - 我无法按下那些不在那里的按键。我正在使用Android 4.1.2三星手机。

也可以有人向我解释什么是0 0 0事件?

2 个答案:

答案 0 :(得分:2)

我很久以前就已经这么做了,所以我不记得所有的细节。希望我不会错过任何重要的事情......
设备上存在的所有输入硬件都映射到文件(它的Linux,当然一切都是文件......)。如果您执行adb shell ls /dev/input,则会看到eventX以及event0以上的event2个文件。这些文件映射到屏幕(触摸屏,而不是显示器!通常为event0),硬键(通常为adb shell cat /dev/input/event0),接近传感器和设备的所有其他传感器/输入。
要记住的另一件事是这些不是正常的"文件,但"字符文件" - 它是一种缓冲区,仅在相关输入设备被激活时才具有数据。您可以输入home,但在您按下设备上的某个实际密钥(例如vol upadb pull /dev/input/event0)之前,您将看不到任何内容。当你按下一个键时,你会在屏幕上看到一些gibrish,但那个gibrish当然有意义。
输入vol up,按下并释放ctrl-c,然后按pull停止event0命令。现在你有一个名为vol. up的二进制文件,所以用一些Hex编辑器打开它,你会得到类似的东西 -

  

59 07 00 00 80 C9 07 00 01 00 18 00 01 00 00 00
   59 07 00 00 80 C9 07 00 00 00 00 00 00 00 00 00
   5A 07 00 00 96 60 01 00 01 00 18 00 00 00 00 00
   5A 07 00 00 96 60 01 00 00 00 00 00 00 00 00 00

每行的前8个字节是事件的时间戳,其他8个字节是事件本身 第一行按下01 00键(little-endian):
18 00是事件的ID。如果同时按下两个键,则会获得两个带有两个ID的事件 01 00密钥代码 01是事件类型。按0000 00(如第3行)即释放 00(最后两个字节)在这里没有使用。例如,对于屏幕触摸,它保持屏幕坐标 第二行是一些包含全零的缓冲区清理/同步事件 第三行正在释放密钥。它与第一行相同,但事件类型为eventFile 第四行又是同步事件 现在,如果您创建一个名为vol. up的文件,其中包含前两行,您实际上有一个按adb push eventFile /dev/input/event0键的序列。您可以使用 - vol. up将其注入设备,并且您会看到key code键被按下但未被释放 - 长按。要释放它,只需用另外两行发送另一个文件。你不必担心时间戳,你可以保持原样 对于不同的密钥,您当然必须更改vol up/down 我已经在我的设备上尝试了它 - 三星S3 mini /4.1.2,带有{{1}}个键并且可以正常工作。我没有尝试使用不存在的键盘按键。

答案 1 :(得分:0)

为了帮助以后可能需要此信息的任何人,以下是我从@TDG 帖子和其他 StackOverflow 答案中汇总的内容。

有不同的文件可以映射到设备硬件,例如触摸屏或物理按钮。尚不清楚相同的文件是否映射到所有 Android 手机上的相同硬件,但我预计有些设备会有所不同,因此请小心。

这些文件被称为 /dev/input/eventX,其中 X 是指硬件的 0 索引号。

要为您感兴趣的设备找到正确的文件,您可以使用 getevent

adb shell su 0 getevent

这将输出每个设备的名称和 ID。当您拥有正确的路径后,您就可以开始侦听传入的事件:

adb shell su 0 getevent /dev/input/event0

当它运行时在您的设备上触发事件,例如按下您感兴趣的按钮。这将输出如下内容:

0001 0095 00000001
0000 0000 00000000
0001 0095 00000000
0000 0000 00000000

这些是我按下并松开硬件按钮时的条目。注意每个事件有2组(前2个是key down,后2个key up)

注意这些值是十六进制的。将它们转换为十进制。使用计算器或 hex2dec 站点来执行此操作。然后您可以使用 sendevent

注入事件

按键

adb shell su 0 sendevent /dev/input/event0 1 149 1 # Hex: 0001 0095 00000001
adb shell su 0 sendevent /dev/input/event0 0 0 0   # Hex: 0000 0000 00000000

按键

adb shell su 0 sendevent /dev/input/event0 1 149 0 # Hex: 0001 0095 00000000
adb shell su 0 sendevent /dev/input/event0 0 0 0   # Hex: 0000 0000 00000000