Zdarzenia wejściowe powłoki ADB

222

Jaka jest podstawowa różnica między adb shell input keyeventi adb shell sendevent? Którego należy użyć do wprowadzenia znaku? Czy kody są takie same, jakie przekazujemy do obu poleceń?

KVR
źródło

Odpowiedzi:

417

Do adb shell input keyevent, albo albo event_codealbo stringzostanie wysłany do urządzenia.

usage: input [text|keyevent]
  input text <string>
  input keyevent <event_code>

Niektóre możliwe wartości dla 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"

sendeventNarzędzie wysyła dotykowy lub klawiatura zdarzenia, a także innych wydarzeń do symulacji zdarzeń sprzętowych. Szczegółowe informacje można znaleźć w tym artykule: Android, powłoka niskiego poziomu kliknij na ekranie .

LionCoder
źródło
1
Cześć @chwentong! Czy możesz mi pomóc w wskazaniu dowolnego miejsca wyjaśniającego „tekst wejściowy <ciąg>” w bardziej szczegółowy sposób? Nie mogę nic na ten temat znaleźć, podobnie jak developer.android.com/reference/android/view/KeyEvent.html Dzięki!
stansult
Cześć! Czy mogę zapytać, jak wprowadzić ciąg zawierający spację w konsoli wiersza poleceń systemu Windows? Próbuję wejść, >adb shell input text "a b"ale nie pracuję.
Wei Yang,
1
skąd masz informacje o poleceniu „input”? jakie inne funkcje są ukryte w dokumentacji (tutaj: developer.android.com/tools/help/adb.html )?
programista Androida
4
@WeiYang, spróbuj tego,> adb shell tekst wejściowy „a% sb”
Natan Lotério
3
Ten post był bardzo pomocny, gdy ekran mojego tabletu z Androidem się zepsuł i nie reagował na dotyk. Byłem w stanie „wpisać” pin używając klucza wejściowego powłoki adb i znaleźć sposób na obejście. Dzięki!
j0aqu1n
194

Aktualizacja:

Używanie adb shell input:

Wstaw tekst:

adb shell input text "insert%syour%stext%shere"

(obs:% s oznacza SPACJĘ)

..

Kody zdarzeń:

adb shell input keyevent 82

(82 ---> MENU_BUTTON)

„Więcej kodów kluczowych zdarzeń znajduje się na liście poniżej”

..

Dotknij pozycji X, Y:

adb shell input tap 500 1450

Aby znaleźć dokładną pozycję X, Y, którą chcesz dotknąć Stuknij przejdź do:

Ustawienia> Opcje programisty> Zaznacz opcję LOKALIZACJA POINTER

..

Przesuń X1 Y1 X2 Y2 [czas trwania (ms)]:

adb shell input swipe 100 500 100 1450 100

w tym przykładzie X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Czas trwania = 100 ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

używamy tego samego polecenia do przeciągnięcia, aby emulować długie naciśnięcie

w tym przykładzie X = 100, Y = 500, czas trwania = 250 ms

..

Lista zaktualizowanych kodów zdarzeń:

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"

Pełna lista poleceń znajduje się na stronie: http://developer.android.com/reference/android/view/KeyEvent.html

Rene Barbosa
źródło
1
Ta lista jest oczywiście dłuższa dla późniejszych wersji Androida, na przykład dla 4.2.2 możemy je znaleźć w android.view.KeyEvent.java , gdzie ich liczba wynosi do 219.
not2qubit
Dzięki za polecenie przeciągnięcia, dużo tego szukałem.
David
W opcjach programisty włącz opcję „Lokalizacja wskaźnika”, aby określić poprawne współrzędne podczas wprowadzania zdarzeń dotykowych.
Dick Lucas,
Tylko dla dodatkowych informacji. Swipe działał na moim telefonie tylko wtedy, gdy czas był większy niż 120 !! adb shell input swipe 200 800 200 400 200
Jose Rodrigues
74

Ponadto, jeśli chcesz wysłać osadzone spacje za pomocą polecenia wejściowego, użyj% s

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

ustąpi

this is an example 

będąc wkładem.

%sam nie musi uciekać - tylko specjalna %spara jest traktowana specjalnie. Prowadzi to oczywiście do oczywistego pytania, jak wprowadzić literalny ciąg %s... który miałbyś do czynienia z dwoma oddzielnymi poleceniami.

Fred Clift
źródło
Jakiś sposób, aby tutaj wyłączyć automatyczne poprawianie? Poza tym działa świetnie :)
Patrick Boos
Oto prosty skrypt bashowy, aby zająć się ucieczką, dzięki czemu możesz po prostu powiedzieć atext "Hey, I'm here"i działa.
Dan Dascalescu
12

Nawiasem mówiąc, jeśli próbujesz znaleźć sposób na wysyłanie podwójnych cudzysłowów do urządzenia, spróbuj wykonać następujące czynności:

tekst wejściowy powłoki adb „\”

Nie jestem pewien, dlaczego nie ma kodu zdarzenia dla cytatów, ale to obejście działa. Ponadto jeśli używasz MonkeyDevice (lub ChimpChat), powinieneś przetestować każdy znak przed wywołaniem monkeyDevice.type, w przeciwnym razie nic nie otrzymasz, gdy spróbujesz wysłać „

H Ribeiro
źródło
1
Stworzyłem prosty skrypt bash, aby zająć się wszystkimi ucieczkami, abyś mógł powiedzieć atext "Hey, I'm here"i działa.
Dan Dascalescu
9

Jeszcze jedna różnica:

  • wejście powłoki adb ” wywołuje metodę input.jar w celu przetworzenia i wysłania kodu klucza z warstwy Java platformy Android.
  • adb sendevent ” to tak naprawdę kod c (część narzędzia Toolbox), który wysyła kod wejściowy bezpośrednio do / dev / input .... w systemie Linux.

Bardziej szczegółowe informacje na temat śledzenia kodu w AOSP Framework można znaleźć tutaj:

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

Y_Yen
źródło
więc w skrócie sendevent jest znacznie szybszy niż wejście adb!
JerryGoyal,
7

Napisałem prosty skrypt Powershell dla użytkowników systemu Windows do mapowania kluczy na zdarzenia wejściowe powłoki adb. I kontroluj urządzenie z systemem Android zdalnie przez sieć LAN. Nie wiem, czy ktokolwiek uzna to za przydatne, ale i tak to podzielę.

$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
źródło
4

Jeśli chcesz wysłać tekst do określonego urządzenia, gdy podłączonych jest wiele urządzeń. Najpierw wyszukaj podłączone urządzenia za pomocą urządzeń adb

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

następnie uzyskaj identyfikator konkretnego urządzenia i spróbuj wykonać następujące czynności

adb -s 31002d9e592b7300 shell input text 'your text'
Karthik Bollisetti
źródło
Powinien to być twój tekst%
royatirek
2

Aby wysłać połączenie przeładowania do aplikacji React-Native działającej na urządzeniu z Androidem: adb shell input keyboard text "rr"

MorenoMdz
źródło