有answered question about sending long presses on android,问题在于
从关于链接问题的最高投票答案开始,我有以下代码:
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
事件?
答案 0 :(得分:2)
我很久以前就已经这么做了,所以我不记得所有的细节。希望我不会错过任何重要的事情......
设备上存在的所有输入硬件都映射到文件(它的Linux,当然一切都是文件......)。如果您执行adb shell ls /dev/input
,则会看到eventX
以及event0
以上的event2
个文件。这些文件映射到屏幕(触摸屏,而不是显示器!通常为event0
),硬键(通常为adb shell cat /dev/input/event0
),接近传感器和设备的所有其他传感器/输入。
要记住的另一件事是这些不是正常的"文件,但"字符文件" - 它是一种缓冲区,仅在相关输入设备被激活时才具有数据。您可以输入home
,但在您按下设备上的某个实际密钥(例如vol up
或adb 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
是事件类型。按00
,00 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