ADB Shell 输入事件
Posted
技术标签:
【中文标题】ADB Shell 输入事件【英文标题】:ADB Shell Input Events 【发布时间】:2011-12-09 01:02:00 【问题描述】:adb shell input keyevent
和adb shell sendevent
的基本区别是什么?我应该使用哪一个来输入字符?我们传递给两个命令的键码是否相同?
【问题讨论】:
【参考方案1】:adb shell input keyevent
将向设备发送event_code
或string
。
usage: input [text|keyevent]
input text <string>
input keyevent <event_code>
event_code
的一些可能值是:
0 --> "KEYCODE_UNKNOWN"
1 --> "KEYCODE_MENU"
2 --> "KEYCODE_SOFT_RIGHT"
3 --> "KEYCODE_HOME"
4 --> "KEYCODE_BACK"
5 --> "KEYCODE_CALL"
6 --> "KEYCODE_ENDCALL"
7 --> "KEYCODE_0"
8 --> "KEYCODE_1"
9 --> "KEYCODE_2"
10 --> "KEYCODE_3"
11 --> "KEYCODE_4"
12 --> "KEYCODE_5"
13 --> "KEYCODE_6"
14 --> "KEYCODE_7"
15 --> "KEYCODE_8"
16 --> "KEYCODE_9"
17 --> "KEYCODE_STAR"
18 --> "KEYCODE_POUND"
19 --> "KEYCODE_DPAD_UP"
20 --> "KEYCODE_DPAD_DOWN"
21 --> "KEYCODE_DPAD_LEFT"
22 --> "KEYCODE_DPAD_RIGHT"
23 --> "KEYCODE_DPAD_CENTER"
24 --> "KEYCODE_VOLUME_UP"
25 --> "KEYCODE_VOLUME_DOWN"
26 --> "KEYCODE_POWER"
27 --> "KEYCODE_CAMERA"
28 --> "KEYCODE_CLEAR"
29 --> "KEYCODE_A"
30 --> "KEYCODE_B"
31 --> "KEYCODE_C"
32 --> "KEYCODE_D"
33 --> "KEYCODE_E"
34 --> "KEYCODE_F"
35 --> "KEYCODE_G"
36 --> "KEYCODE_H"
37 --> "KEYCODE_I"
38 --> "KEYCODE_J"
39 --> "KEYCODE_K"
40 --> "KEYCODE_L"
41 --> "KEYCODE_M"
42 --> "KEYCODE_N"
43 --> "KEYCODE_O"
44 --> "KEYCODE_P"
45 --> "KEYCODE_Q"
46 --> "KEYCODE_R"
47 --> "KEYCODE_S"
48 --> "KEYCODE_T"
49 --> "KEYCODE_U"
50 --> "KEYCODE_V"
51 --> "KEYCODE_W"
52 --> "KEYCODE_X"
53 --> "KEYCODE_Y"
54 --> "KEYCODE_Z"
55 --> "KEYCODE_COMMA"
56 --> "KEYCODE_PERIOD"
57 --> "KEYCODE_ALT_LEFT"
58 --> "KEYCODE_ALT_RIGHT"
59 --> "KEYCODE_SHIFT_LEFT"
60 --> "KEYCODE_SHIFT_RIGHT"
61 --> "KEYCODE_TAB"
62 --> "KEYCODE_SPACE"
63 --> "KEYCODE_SYM"
64 --> "KEYCODE_EXPLORER"
65 --> "KEYCODE_ENVELOPE"
66 --> "KEYCODE_ENTER"
67 --> "KEYCODE_DEL"
68 --> "KEYCODE_GRAVE"
69 --> "KEYCODE_MINUS"
70 --> "KEYCODE_EQUALS"
71 --> "KEYCODE_LEFT_BRACKET"
72 --> "KEYCODE_RIGHT_BRACKET"
73 --> "KEYCODE_BACKSLASH"
74 --> "KEYCODE_SEMICOLON"
75 --> "KEYCODE_APOSTROPHE"
76 --> "KEYCODE_SLASH"
77 --> "KEYCODE_AT"
78 --> "KEYCODE_NUM"
79 --> "KEYCODE_HEADSETHOOK"
80 --> "KEYCODE_FOCUS"
81 --> "KEYCODE_PLUS"
82 --> "KEYCODE_MENU"
83 --> "KEYCODE_NOTIFICATION"
84 --> "KEYCODE_SEARCH"
85 --> "TAG_LAST_KEYCODE"
sendevent
实用程序发送触摸或键盘事件,以及用于模拟硬件事件的其他事件。详情参考这篇文章:android, low level shell click on screen。
【讨论】:
嗨@chwentong!你能帮我指出任何解释“输入文本>adb shell input text "a b"
但不起作用。
你从哪里得到“输入”命令的信息?文档中还隐藏了哪些其他功能(此处:developer.android.com/tools/help/adb.html)?
@WeiYang,试试这个,>adb shell input text "a%sb"
当我的 Android 平板电脑的屏幕坏了,触摸没有反应时,这篇文章非常有用。我能够通过使用 adb shell input keyevent “键入” pin 并找到我的方式。谢谢!【参考方案2】:
更新:
使用adb shell input
:
插入文字:
adb shell input text "insert%syour%stext%shere"
(obs: %s 表示空间)
..
事件代码:
adb shell input keyevent 82
(82 ---> 菜单按钮)
“更多关键事件代码见下表”
..
点按 X、Y 位置:
adb shell input tap 500 1450
要找到您想要点击的确切 X、Y 位置,请转到:
设置 > 开发者选项 > 勾选 POINTER SLOCATION 选项
..
滑动 X1 Y1 X2 Y2 [持续时间(毫秒)]:
adb shell input swipe 100 500 100 1450 100
在本例中 X1=100, Y1=500, X2=100, Y2=1450, 持续时间 = 100ms
..
长按 X Y:
adb shell input swipe 100 500 100 500 250
我们使用相同的命令进行滑动来模拟长按
在此示例中 X=100,Y=500,持续时间 = 250 毫秒
..
事件代码更新列表:
0 --> "KEYCODE_0"
1 --> "KEYCODE_SOFT_LEFT"
2 --> "KEYCODE_SOFT_RIGHT"
3 --> "KEYCODE_HOME"
4 --> "KEYCODE_BACK"
5 --> "KEYCODE_CALL"
6 --> "KEYCODE_ENDCALL"
7 --> "KEYCODE_0"
8 --> "KEYCODE_1"
9 --> "KEYCODE_2"
10 --> "KEYCODE_3"
11 --> "KEYCODE_4"
12 --> "KEYCODE_5"
13 --> "KEYCODE_6"
14 --> "KEYCODE_7"
15 --> "KEYCODE_8"
16 --> "KEYCODE_9"
17 --> "KEYCODE_STAR"
18 --> "KEYCODE_POUND"
19 --> "KEYCODE_DPAD_UP"
20 --> "KEYCODE_DPAD_DOWN"
21 --> "KEYCODE_DPAD_LEFT"
22 --> "KEYCODE_DPAD_RIGHT"
23 --> "KEYCODE_DPAD_CENTER"
24 --> "KEYCODE_VOLUME_UP"
25 --> "KEYCODE_VOLUME_DOWN"
26 --> "KEYCODE_POWER"
27 --> "KEYCODE_CAMERA"
28 --> "KEYCODE_CLEAR"
29 --> "KEYCODE_A"
30 --> "KEYCODE_B"
31 --> "KEYCODE_C"
32 --> "KEYCODE_D"
33 --> "KEYCODE_E"
34 --> "KEYCODE_F"
35 --> "KEYCODE_G"
36 --> "KEYCODE_H"
37 --> "KEYCODE_I"
38 --> "KEYCODE_J"
39 --> "KEYCODE_K"
40 --> "KEYCODE_L"
41 --> "KEYCODE_M"
42 --> "KEYCODE_N"
43 --> "KEYCODE_O"
44 --> "KEYCODE_P"
45 --> "KEYCODE_Q"
46 --> "KEYCODE_R"
47 --> "KEYCODE_S"
48 --> "KEYCODE_T"
49 --> "KEYCODE_U"
50 --> "KEYCODE_V"
51 --> "KEYCODE_W"
52 --> "KEYCODE_X"
53 --> "KEYCODE_Y"
54 --> "KEYCODE_Z"
55 --> "KEYCODE_COMMA"
56 --> "KEYCODE_PERIOD"
57 --> "KEYCODE_ALT_LEFT"
58 --> "KEYCODE_ALT_RIGHT"
59 --> "KEYCODE_SHIFT_LEFT"
60 --> "KEYCODE_SHIFT_RIGHT"
61 --> "KEYCODE_TAB"
62 --> "KEYCODE_SPACE"
63 --> "KEYCODE_SYM"
64 --> "KEYCODE_EXPLORER"
65 --> "KEYCODE_ENVELOPE"
66 --> "KEYCODE_ENTER"
67 --> "KEYCODE_DEL"
68 --> "KEYCODE_GRAVE"
69 --> "KEYCODE_MINUS"
70 --> "KEYCODE_EQUALS"
71 --> "KEYCODE_LEFT_BRACKET"
72 --> "KEYCODE_RIGHT_BRACKET"
73 --> "KEYCODE_BACKSLASH"
74 --> "KEYCODE_SEMICOLON"
75 --> "KEYCODE_APOSTROPHE"
76 --> "KEYCODE_SLASH"
77 --> "KEYCODE_AT"
78 --> "KEYCODE_NUM"
79 --> "KEYCODE_HEADSETHOOK"
80 --> "KEYCODE_FOCUS"
81 --> "KEYCODE_PLUS"
82 --> "KEYCODE_MENU"
83 --> "KEYCODE_NOTIFICATION"
84 --> "KEYCODE_SEARCH"
85 --> "KEYCODE_MEDIA_PLAY_PAUSE"
86 --> "KEYCODE_MEDIA_STOP"
87 --> "KEYCODE_MEDIA_NEXT"
88 --> "KEYCODE_MEDIA_PREVIOUS"
89 --> "KEYCODE_MEDIA_REWIND"
90 --> "KEYCODE_MEDIA_FAST_FORWARD"
91 --> "KEYCODE_MUTE"
92 --> "KEYCODE_PAGE_UP"
93 --> "KEYCODE_PAGE_DOWN"
94 --> "KEYCODE_PICTSYMBOLS"
...
122 --> "KEYCODE_MOVE_HOME"
123 --> "KEYCODE_MOVE_END"
完整的命令列表可以在以下位置找到: http://developer.android.com/reference/android/view/KeyEvent.html
【讨论】:
这个列表对于更高版本的 Android 显然更长,例如对于 4.2.2 我们可以在android.view.KeyEvent.java 中找到它们,它们的编号高达 219。 感谢滑动命令,我一直在寻找。 在开发者选项中,启用“指针位置”来确定输入触摸事件时的正确坐标。 仅供参考。如果时间大于 120,则滑动仅在我的手机上有效!adb shell input swipe 200 800 200 400 200
adb shell 输入 keyevent KEYCODE_HOME 也可以【参考方案3】:
另外,如果您想通过输入命令发送嵌入的空格,请使用%s
adb shell input text 'this%sis%san%sexample'
将产生
这是一个例子
正在输入。
%
本身不需要转义 - 只有特殊的 %s
对被特殊处理。这当然会引出一个显而易见的问题,即如何输入文字字符串 %s
,您必须使用两个单独的命令。
【讨论】:
这里有什么方法可以关闭自动更正吗?否则效果很好:) 这里有一个simple bash script 来处理转义,所以你可以直接说atext "Hey, I'm here"
就可以了。
你知道是否可以输入 unicode 吗?还是只有ascii?【参考方案4】:
顺便说一句,如果您正试图找到一种向设备发送双引号的方法,请尝试以下操作:
adb shell 输入文本'\"'
我不确定为什么没有引号的事件代码,但这种解决方法可以解决问题。此外,如果您使用 MonkeyDevice(或 ChimpChat),您应该在调用 monkeyDevice.type 之前测试每个字符,否则当您尝试发送“
【讨论】:
我已经创建了一个simple bash script 来处理所有的转义,所以你可以直接说atext "Hey, I'm here"
就可以了。【参考方案5】:
我为 Windows 用户编写了一个简单的 Powershell 脚本,用于将键映射到 adb shell 输入事件。并通过 LAN 远程控制 Android 设备。 不知道有没有人觉得有用,不过还是分享一下吧。
$ip = 192.168.1.8
cd D:\Android\android-sdk-windows\platform-tools\; .\adb.exe disconnect $ip; .\adb.exe connect $ip
$adbKeyNum = @LeftWindows = "1"; F1 = "3"; Enter = "66"; UpArrow = "19"; DownArrow = "20"; LeftArrow = "21"; RightArrow = "22"; Add = "24";
Subtract = "25"; Backspace = "4"; P = "26"
while(1 -eq 1)
$keyPress = [Console]::ReadKey($true).Key
if ([string]$keyPress -eq "F10")
.\adb.exe disconnect $ip
exit
elseif ([string]$keyPress -eq "F6")
$string = Read-Host -Prompt 'Input the string: '
.\adb.exe shell input text $string
elseif ($adbKeyNum.ContainsKey([string]$keyPress))
echo $adbKeyNum.Get_Item([string]$keyPress)
.\adb.exe shell input keyevent $adbKeyNum.Get_Item([string]$keyPress)
【讨论】:
【参考方案6】:另一个区别:
“adb shell input”正在调用input.jar来处理和发送来自android框架Java层的keycode。 “adb sendevent”实际上是 c 代码(工具箱实用程序的一部分),将输入代码直接发送到 Linux 输入子系统的 /dev/input....。更详细的 AOSP 框架内部代码跟踪可以在这里找到:
http://www.srcmap.org/sd_share/4/aba57bc6/AOSP_adb_shell_input_Code_Trace.html#RefId=7c8f5285
【讨论】:
所以简而言之,sendevent 比 adb 输入快得多! 这回答了 OP 问题;这是问题的直接答案。【参考方案7】:如果您想在连接多个设备时向特定设备发送文本。首先使用 adb devices
查找连接的设备adb devices
List of devices attached
3004e25a57192200 device
31002d9e592b7300 device
然后获取您的特定设备 ID 并尝试以下操作
adb -s 31002d9e592b7300 shell input text 'your text'
【讨论】:
应该是你的%text【参考方案8】:要向 Android 设备中运行的 React-Native 应用发送重新加载调用:adb shell input keyboard text "rr"
【讨论】:
以上是关于ADB Shell 输入事件的主要内容,如果未能解决你的问题,请参考以下文章