Eventi di input della shell ADB


222

Qual è la differenza di base tra adb shell input keyevente adb shell sendevent? Quale dovrei usare per inserire un personaggio? I codici chiave sono gli stessi che passiamo a entrambi i comandi?

Risposte:


417

Entro adb shell input keyevent, un event_codeo un stringverrà inviato al dispositivo.

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

Alcuni valori possibili per event_codesono:

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"

L' sendeventutilità invia eventi touch o tastiera, nonché altri eventi per simulare gli eventi hardware. Fare riferimento a questo articolo per i dettagli: Android, shell di basso livello fare clic sullo schermo .


1
Ciao @chwentong! Potete per favore aiutarmi a indicare qualsiasi posto che spieghi in modo più dettagliato "input text <string>"? Non riesco a trovare nulla al riguardo, simile a developer.android.com/reference/android/view/KeyEvent.html Grazie!
stansult,

Ciao! Posso chiedere come posso inserire la stringa contenente spazio in una console della riga di comando di Windows? Provo ad entrare >adb shell input text "a b"ma non lavoro.
Wei Yang,

1
dove hai preso le informazioni del comando "input"? quali altre funzioni sono nascoste dalla documentazione (qui: developer.android.com/tools/help/adb.html )?
Sviluppatore Android

4
@WeiYang, prova questo,> testo di input della shell adb "a% sb"
Natan Lotério

3
Questo post è stato molto utile quando lo schermo del mio tablet Android si è rotto e non ha risposto ai tocchi. Sono stato in grado di "digitare" il pin utilizzando keyevent di input della shell adb e di orientarmi. Grazie!
j0aqu1n,

194

In aggiornamento:

Utilizzando adb shell input:

Inserisci testo:

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

(obs:% s significa SPAZIO)

..

Codici evento:

adb shell input keyevent 82

(82 ---> MENU_BUTTON)

"Per altri codici keyevents vedi l'elenco sotto"

..

Tocca X, posizione Y:

adb shell input tap 500 1450

Per trovare la posizione X, Y esatta che vuoi toccare vai a:

Impostazioni> Opzioni sviluppatore> Seleziona l'opzione PUNTATORE SLOCATION

..

Scorri X1 Y1 X2 Y2 [durata (ms)]:

adb shell input swipe 100 500 100 1450 100

in questo esempio X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Durata = 100ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

utilizziamo lo stesso comando per un colpo per emulare una pressione prolungata

in questo esempio X = 100, Y = 500, Durata = 250 ms

..

Elenco aggiornato dei codici evento:

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"

L'elenco completo dei comandi è disponibile su: http://developer.android.com/reference/android/view/KeyEvent.html


1
Questo elenco è ovviamente più lungo per le versioni successive di Android, ad esempio per 4.2.2 le possiamo trovare in android.view.KeyEvent.java , dove sono
numerate

Grazie per il comando swipe, lo stavo cercando molto.
David,

Nelle opzioni sviluppatore, abilitare "Posizione puntatore" per determinare le coordinate corrette quando si immettono eventi touch.
Dick Lucas,

Solo per ulteriori informazioni. Swipe ha funzionato sul mio telefono solo se il tempo era superiore a 120 !! adb shell input swipe 200 800 200 400 200
Jose Rodrigues,

74

Inoltre, se si desidera inviare spazi incorporati con il comando di input, utilizzare% s

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

cederà

this is an example 

essere inserito.

%di per sé non ha bisogno di scappare - solo la %scoppia speciale viene trattata in modo speciale. Questo porta ovviamente all'ovvia domanda su come inserire la stringa letterale %s... che dovresti fare con due comandi separati.


Un modo per disattivare la correzione automatica qui? Altrimenti funziona alla grande :)
Patrick Boos,

Ecco un semplice script bash per occuparsi dell'evasione, quindi puoi solo dirlo atext "Hey, I'm here"e funziona.
Dan Dascalescu,

12

A proposito, se stai cercando di trovare un modo per inviare doppie virgolette al dispositivo, prova quanto segue:

testo di input della shell adb '\ "'

Non sono sicuro del motivo per cui non esiste un codice evento per le virgolette, ma questa soluzione alternativa fa il lavoro. Inoltre, se stai usando MonkeyDevice (o ChimpChat) dovresti testare ogni personaggio prima di invocare monkeyDevice.type, altrimenti non otterrai nulla quando provi a inviare "


1
Ho creato un semplice script bash per occuparmi di tutte le fughe, quindi puoi solo dirlo atext "Hey, I'm here"e funziona.
Dan Dascalescu,

9

Un'altra differenza:

  • " adb shell input " sta chiamando input.jar per elaborare e inviare il codice chiave dal livello Java del framework Android.
  • " adb sendevent " è in realtà un codice c (parte dell'utility toolbox) che invia il codice di input direttamente nel / dev / input .... del sottosistema di input Linux.

Ulteriori tracce di codice di dettaglio all'interno di AOSP Framework sono disponibili qui:

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


quindi in breve sendevent è molto più veloce dell'input adb!
JerryGoyal,

7

Ho scritto un semplice script Powershell per gli utenti di Windows per mappare le chiavi agli eventi di input della shell adb. E controlla un dispositivo Android da remoto tramite LAN. Non so se qualcuno lo trova utile, ma lo condividerò comunque.

$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)
    }
}

4

Se si desidera inviare un testo a un dispositivo specifico quando sono collegati più dispositivi. Per prima cosa cerca i dispositivi collegati utilizzando i dispositivi adb

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

quindi ottieni il tuo ID dispositivo specifico e prova quanto segue

adb -s 31002d9e592b7300 shell input text 'your text'

Dovrebbe essere il tuo% text
royatirek,

2

Per inviare una chiamata di ricarica a un'app React-Native in esecuzione su un dispositivo Android: adb shell input keyboard text "rr"

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.