ADB-Shell-Eingabeereignisse

222

Was ist der grundlegende Unterschied zwischen adb shell input keyeventund adb shell sendevent? Welches soll ich zur Eingabe eines Zeichens verwenden? Sind die Schlüsselcodes dieselben, die wir an beide Befehle übergeben?

KVR
quelle

Antworten:

417

Bis adb shell input keyeventwird entweder ein event_codeoder ein stringan das Gerät gesendet.

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

Einige mögliche Werte für event_codesind:

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"

Das sendeventDienstprogramm sendet Berührungs- oder Tastaturereignisse sowie andere Ereignisse zur Simulation der Hardwareereignisse. Weitere Informationen finden Sie in diesem Artikel: Android, Low-Level-Shell Klicken Sie auf den Bildschirm .

LionCoder
quelle
1
Hallo @chwentong! Können Sie mir bitte helfen, auf eine Stelle zu zeigen, an der „Eingabetext <Zeichenfolge>“ detaillierter erklärt wird? Ich kann nichts darüber finden, ähnlich wie auf developer.android.com/reference/android/view/KeyEvent.html. Danke!
stansult
Hallo! Darf ich fragen, wie ich die Zeichenfolge mit dem Leerzeichen in eine Windows-Befehlszeilenkonsole eingeben kann? Ich versuche einzutreten, >adb shell input text "a b"aber nicht zu arbeiten.
Wei Yang
1
Woher haben Sie die Informationen des Befehls "Eingabe"? Welche anderen Funktionen sind in der Dokumentation nicht enthalten (hier: developer.android.com/tools/help/adb.html )?
Android-Entwickler
4
@WeiYang, versuchen Sie dies,> ADB-Shell-Eingabetext "a% sb"
Natan Lotério
3
Dieser Beitrag war sehr hilfreich, als der Bildschirm meines Android-Tablets kaputt ging und nicht auf Berührungen reagierte. Ich konnte den Pin mit adb shell input keyevent "tippen" und mich zurechtfinden. Vielen Dank!
j0aqu1n
194

Aktualisierung:

Verwenden von adb shell input:

Text einfügen:

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

(obs:% s bedeutet SPACE)

..

Ereigniscodes:

adb shell input keyevent 82

(82 ---> MENU_BUTTON)

"Weitere Codes für wichtige Ereignisse finden Sie in der folgenden Liste."

..

Tippen Sie auf die Position X, Y:

adb shell input tap 500 1450

Um die genaue X- und Y-Position zu finden, auf die Sie tippen möchten, gehen Sie zu:

Einstellungen> Entwickleroptionen> Aktivieren Sie die Option POINTER SLOCATION

..

Wischen Sie X1 Y1 X2 Y2 [Dauer (ms)]:

adb shell input swipe 100 500 100 1450 100

In diesem Beispiel ist X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Dauer = 100 ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

Wir verwenden denselben Befehl für ein Wischen, um ein langes Drücken zu emulieren

In diesem Beispiel ist X = 100, Y = 500, Dauer = 250 ms

..

Aktualisierte Liste der Ereigniscodes:

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"

Die vollständige Liste der Befehle finden Sie unter: http://developer.android.com/reference/android/view/KeyEvent.html

Rene Barbosa
quelle
1
Diese Liste ist offensichtlich länger für spätere Android-Versionen, zum Beispiel für 4.2.2 finden wir sie in android.view.KeyEvent.java , wo sie bis zu 219
nummerieren.
Vielen Dank für den Swipe-Befehl, ich habe viel danach gesucht.
David
Aktivieren Sie in den Entwickleroptionen "Zeigerposition", um die richtigen Koordinaten bei der Eingabe von Berührungsereignissen zu ermitteln.
Dick Lucas
Nur für zusätzliche Informationen. Swipe funktionierte nur auf meinem Handy, wenn die Zeit größer als 120 war !! adb shell input swipe 200 800 200 400 200
Jose Rodrigues
74

Wenn Sie eingebettete Leerzeichen mit dem Eingabebefehl senden möchten, verwenden Sie% s

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

wird nachgeben

this is an example 

eingegeben werden.

%selbst muss nicht entkommen - nur das spezielle %sPaar wird speziell behandelt. Dies führt natürlich zu der offensichtlichen Frage, wie die Literalzeichenfolge eingegeben werden soll %s... was Sie mit zwei separaten Befehlen tun müssten.

Fred Clift
quelle
Gibt es eine Möglichkeit, die automatische Korrektur hier auszuschalten? Ansonsten funktioniert super :)
Patrick Boos
Hier ist ein einfaches Bash-Skript , mit dem Sie sich um die Flucht kümmern können. Sie können also einfach sagen, dass atext "Hey, I'm here"es funktioniert.
Dan Dascalescu
12

Übrigens, wenn Sie versuchen, doppelte Anführungszeichen an das Gerät zu senden, versuchen Sie Folgendes:

ADB-Shell-Eingabetext '\ "'

Ich bin nicht sicher, warum es keinen Ereigniscode für Anführungszeichen gibt, aber diese Problemumgehung erledigt den Job. Wenn Sie MonkeyDevice (oder ChimpChat) verwenden, sollten Sie jedes Zeichen testen, bevor Sie monkeyDevice.type aufrufen. Andernfalls erhalten Sie nichts, wenn Sie versuchen zu senden. "

H Ribeiro
quelle
1
Ich habe ein einfaches Bash-Skript erstellt , um mich um das Entkommen zu kümmern. Sie können also einfach sagen, dass atext "Hey, I'm here"es funktioniert.
Dan Dascalescu
9

Ein weiterer Unterschied:

  • " adb shell input " ruft die Datei input.jar auf, um den Schlüsselcode von der Java-Schicht des Android-Frameworks zu verarbeiten und zu senden.
  • " adb sendevent " ist eigentlich c-Code (Teil des Toolbox-Dienstprogramms), der den Eingabecode direkt in das / dev / input .... des Linux-Eingabesubsystems sendet.

Weitere Informationen zum Code-Trace in AOSP Framework finden Sie hier:

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

Y_Yen
quelle
Kurz gesagt, sendevent ist viel schneller als adb input!
JerryGoyal
7

Ich habe ein einfaches Powershell-Skript geschrieben, mit dem Windows-Benutzer Schlüssel Adb-Shell-Eingabeereignissen zuordnen können. Und steuern Sie ein Android-Gerät ferngesteuert über LAN. Ich weiß nicht, ob es jemand nützlich findet, aber ich werde es trotzdem teilen.

$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
quelle
4

Wenn Sie einen Text an ein bestimmtes Gerät senden möchten, wenn mehrere Geräte verbunden sind. Suchen Sie zuerst mit adb-Geräten nach den angeschlossenen Geräten

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

Holen Sie sich dann Ihre spezifische Geräte-ID und versuchen Sie Folgendes

adb -s 31002d9e592b7300 shell input text 'your text'
Karthik Bollisetti
quelle
Es sollte Ihr% text sein
royatirek
2

So senden Sie einen Reload-Anruf an eine React-Native-App, die auf einem Android-Gerät ausgeführt wird: adb shell input keyboard text "rr"

MorenoMdz
quelle