Événements d'entrée du shell ADB

222

Quelle est la différence fondamentale entre adb shell input keyeventet adb shell sendevent? Lequel dois-je utiliser pour saisir un caractère? Les codes-clés sont-ils les mêmes que ceux que nous transmettons aux deux commandes?

KVR
la source

Réponses:

417

Par adb shell input keyevent, un event_codeou un stringsera envoyé à l'appareil.

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

Certaines valeurs possibles pour event_codesont:

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' sendeventutilitaire envoie des événements tactiles ou clavier, ainsi que d'autres événements pour simuler les événements matériels. Référez-vous à cet article pour plus de détails: Android, shell bas niveau cliquez sur l'écran .

LionCoder
la source
1
Salut @chwentong! Pouvez-vous s'il vous plaît m'aider à pointer vers n'importe quel endroit expliquant de manière plus détaillée «texte d'entrée <chaîne>»? Je ne trouve rien à ce sujet, similaire à developer.android.com/reference/android/view/KeyEvent.html Merci!
stansult
Salut! Puis-je demander comment puis-je entrer la chaîne contenant de l'espace dans une console de ligne de commande Windows? J'essaye d'entrer >adb shell input text "a b"mais ne travaille pas.
Wei Yang
1
où avez-vous obtenu les informations de la commande "input"? quelles autres fonctionnalités sont cachées dans la documentation (ici: developer.android.com/tools/help/adb.html )?
développeur Android
4
@WeiYang, essayez ceci,> texte d'entrée du shell adb "a% sb"
Natan Lotério
3
Ce message a été très utile lorsque l'écran de ma tablette Android s'est cassé et qu'il ne répondait pas aux touches. J'ai pu "taper" la broche en utilisant l'entrée de clé du shell adb et trouver mon chemin. Merci!
j0aqu1n
194

Mise à jour:

En utilisant adb shell input:

Insérer du texte:

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

(obs:% s signifie ESPACE)

..

Codes d'événement:

adb shell input keyevent 82

(82 ---> BOUTON_MENU)

"Pour plus de codes d'événements clés, voir la liste ci-dessous"

..

Appuyez sur la position X, Y:

adb shell input tap 500 1450

Pour trouver la position X, Y exacte que vous souhaitez taper, allez à:

Paramètres> Options développeur> Cochez l'option POINTER SLOCATION

..

Balayez X1 Y1 X2 Y2 [durée (ms)]:

adb shell input swipe 100 500 100 1450 100

dans cet exemple X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Duration = 100ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

nous utilisons la même commande pour un coup pour émuler une pression longue

dans cet exemple X = 100, Y = 500, Duration = 250ms

..

Liste des codes d'événements mise à jour:

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"

La liste complète des commandes se trouve sur: http://developer.android.com/reference/android/view/KeyEvent.html

René Barbosa
la source
1
Cette liste est évidemment plus longue pour les versions ultérieures d'Android, par exemple pour 4.2.2, nous pouvons les trouver dans android.view.KeyEvent.java , où elles sont numérotées jusqu'à 219.
not2qubit
Merci pour la commande swipe, je cherchais beaucoup cela.
David
Dans les options du développeur, activez «Emplacement du pointeur» pour déterminer les coordonnées correctes lors de la saisie des événements tactiles.
Dick Lucas
Juste pour des informations supplémentaires. Swipe ne fonctionnait sur mon téléphone que si le temps était supérieur à 120 !! adb shell input swipe 200 800 200 400 200
Jose Rodrigues
74

De plus, si vous souhaitez envoyer des espaces intégrés avec la commande d'entrée, utilisez% s

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

donnera

this is an example 

étant entrée.

%lui-même n'a pas besoin de s'échapper - seule la %spaire spéciale est traitée spécialement. Cela conduit bien sûr à la question évidente de savoir comment entrer la chaîne littérale %s... ce que vous auriez à faire avec deux commandes distinctes.

Fred Clift
la source
Est-il possible de désactiver la correction automatique ici? Sinon, ça marche très bien :)
Patrick Boos
Voici un script bash simple pour prendre soin de vous échapper, vous pouvez donc simplement dire atext "Hey, I'm here"et cela fonctionne.
Dan Dascalescu
12

Soit dit en passant, si vous essayez de trouver un moyen d'envoyer des guillemets doubles à l'appareil, essayez ce qui suit:

texte d'entrée du shell adb '\ "'

Je ne sais pas pourquoi il n'y a pas de code d'événement pour les guillemets, mais cette solution de contournement fait le travail. De plus, si vous utilisez MonkeyDevice (ou ChimpChat), vous devez tester chaque caractère avant d'appeler monkeyDevice.type, sinon vous n'obtiendrez rien lorsque vous essayez d'envoyer "

H Ribeiro
la source
1
J'ai créé un script bash simple pour prendre en charge tous les échappements, vous pouvez donc simplement dire atext "Hey, I'm here"et cela fonctionne.
Dan Dascalescu
9

Une autre différence:

  • " adb shell input " appelle le fichier input.jar pour traiter et envoyer le code clé à partir de la couche Java du framework Android.
  • " adb sendevent " est en fait du code c (qui fait partie de l'utilitaire de boîte à outils) qui envoie le code d'entrée directement dans le / dev / input .... du sous-système d'entrée Linux.

Une trace de code plus détaillée dans le cadre AOSP peut être trouvée ici:

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

Y_Yen
la source
donc en résumé, sendevent est bien plus rapide que l'entrée adb!
JerryGoyal
7

J'ai écrit un simple script Powershell pour les utilisateurs de Windows afin de mapper les clés aux événements d'entrée du shell adb. Et contrôlez un appareil Android à distance via LAN. Je ne sais pas si quelqu'un le trouve utile, mais je le partagerai quand même.

$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
la source
4

Si vous souhaitez envoyer un texte à un appareil spécifique lorsque plusieurs appareils sont connectés. Recherchez d'abord les appareils connectés à l'aide d' appareils adb

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

puis obtenez votre identifiant d'appareil spécifique et essayez ce qui suit

adb -s 31002d9e592b7300 shell input text 'your text'
Karthik Bollisetti
la source
Ce devrait être votre% text
royatirek
2

Pour envoyer un appel de rechargement à une application React-Native exécutée sur un appareil Android: adb shell input keyboard text "rr"

MorenoMdz
la source