Входные события оболочки ADB

222

В чем принципиальная разница между adb shell input keyeventи adb shell sendevent? Какой из них я должен использовать для ввода символа? Являются ли коды клавиш одинаковыми, которые мы передаем обеим командам?

КВР
источник

Ответы:

417

By 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, низкоуровневая оболочка, клик по экрану .

LionCoder
источник
1
Привет @chwentong! Не могли бы вы помочь мне указать на любое место, объясняющее «входной текст <строка>» более подробно? Я ничего не могу найти по этому поводу, как на developer.android.com/reference/android/view/KeyEvent.html Спасибо!
stansult
Здравствуй! Могу ли я спросить, как я могу ввести строку, содержащую пробел, в консоли командной строки Windows? Я пытаюсь войти, >adb shell input text "a b"но не работаю.
Вэй Ян
1
откуда вы взяли информацию о команде ввода? какие другие функции скрыты от документации (здесь: developer.android.com/tools/help/adb.html )?
Android-разработчик
4
@WeiYang, попробуйте это,> ввод текста в оболочке adb "a% sb"
Натан Лотерио
3
Этот пост был очень полезен, когда сломался экран моего планшета Android, и он не реагировал на прикосновения. Я смог "набрать" пин-код с помощью ввода ключа оболочки adb и найти способ обойти. Спасибо!
j0aqu1n
194

Обновление:

Использование 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, которое вы хотите нажать, перейдите по ссылке:

Настройки> Параметры разработчика> Проверьте опцию РАЗМЕЩЕНИЕ УКАЗАТЕЛЯ

..

Размах X1 Y1 X2 Y2 [длительность (мс)]:

adb shell input swipe 100 500 100 1450 100

в этом примере X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, длительность = 100 мс

..

LongPress XY:

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

Рене Барбоса
источник
1
Этот список, очевидно, длиннее для более поздних версий Android, например, для 4.2.2 мы можем найти их в android.view.KeyEvent.java , где их число до 219.
not2qubit
Спасибо за команду смахивания, я искал это много.
Дэвид
В параметрах разработчика включите «Расположение указателя», чтобы определить правильные координаты при вводе событий касания.
Дик Лукас
Просто для дополнительной информации. Размах работал только на моем телефоне, если время было больше, чем 120! adb shell input swipe 200 800 200 400 200
Хосе Родригес
74

Кроме того, если вы хотите отправить встроенные пробелы с помощью команды ввода, используйте% s

adb shell input text 'this%sis%san%sexample'   

даст

this is an example 

быть входом.

%сам по себе не нуждается в побеге - %sобрабатывается только специальная пара. Это, конечно, приводит к очевидному вопросу о том, как вводить буквенную строку %s... что вы должны сделать с двумя отдельными командами.

Фред Клифт
источник
Есть ли способ отключить автокоррекцию здесь? В остальном прекрасно работает :)
Патрик Боос
Вот простой bash-скрипт, который позаботится о побеге, так что вы можете просто сказать, atext "Hey, I'm here"и это работает.
Дан Даскалеску
12

Кстати, если вы пытаетесь найти способ отправки двойных кавычек на устройство, попробуйте следующее:

ввод текста в оболочке adb '\ "'

Я не уверен, почему нет кода события для кавычек, но этот обходной путь делает работу. Кроме того, если вы используете MonkeyDevice (или ChimpChat), вы должны протестировать каждый символ перед вызовом monkeyDevice.type, в противном случае вы ничего не получите при попытке отправить "

Н Рибейро
источник
1
Я сделал простой сценарий bash, чтобы позаботиться обо всем побеге, так что вы можете просто сказать, atext "Hey, I'm here"и это работает.
Дан Даскалеску
9

Еще одно отличие:

  • « adb shell input » вызывает input.jar для обработки и отправки кода ключа из уровня Java платформы Android.
  • " adb sendevent " - это фактически код c (часть утилиты toolbox ), который отправляет входной код непосредственно в / dev / input .... подсистемы ввода Linux.

Более подробную информацию о трассировке кода внутри AOSP Framework можно найти здесь:

http://www.srcmap.org/sd_share/4/aba57bc6/AOSP_adb_shell_input_Code_Trace.html#RefId=7c8f5285

Y_Yen
источник
поэтому в двух словах sendevent намного быстрее, чем ввод adb!
JerryGoyal
7

Я написал простой скрипт Powershell для пользователей Windows, чтобы сопоставить ключи с событиями ввода оболочки adb. И управлять устройством 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)
    }
}
Espen MS
источник
4

Если вы хотите отправить текст на определенное устройство, когда подключено несколько устройств. Сначала ищите подключенные устройства, используя устройства adb

adb devices
List of devices attached
3004e25a57192200        device
31002d9e592b7300        device

затем получите свой конкретный идентификатор устройства и попробуйте следующее

adb -s 31002d9e592b7300 shell input text 'your text'
Картик Боллисетти
источник
Это должен быть ваш% text
royatirek
2

Чтобы отправить вызов перезагрузки в приложение React-Native, работающее на устройстве Android: adb shell input keyboard text "rr"

MorenoMdz
источник