Eventos de entrada de shell ADB

222

¿Cuál es la diferencia básica entre adb shell input keyeventy adb shell sendevent? ¿Cuál debo usar para ingresar un carácter? ¿Son los códigos clave los mismos que pasamos a los dos comandos?

KVR
fuente

Respuestas:

417

Por adb shell input keyevent, se enviará una event_codeo una stringal dispositivo.

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

Algunos valores posibles para event_codeson:

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"

La sendeventutilidad envía eventos táctiles o de teclado, así como otros eventos para simular los eventos de hardware. Consulte este artículo para obtener más detalles: Android, shell de bajo nivel, haga clic en la pantalla .

LionCoder
fuente
1
Hola @chwentong! ¿Me pueden ayudar señalando algún lugar que explique "texto de entrada <cadena>" de manera más detallada? No puedo encontrar nada al respecto, similar a developer.android.com/reference/android/view/KeyEvent.html ¡Gracias!
stansult
¡Hola! ¿Puedo preguntar cómo puedo ingresar la cadena que contiene espacio en una consola de línea de comandos de Windows? Intento entrar >adb shell input text "a b"pero no trabajo.
Wei Yang
1
¿de dónde sacaste la información del comando "input"? ¿Qué otras características están ocultas de la documentación (aquí: developer.android.com/tools/help/adb.html )?
Desarrollador de Android el
44
@WeiYang, prueba esto,> adb shell input text "a% sb"
Natan Lotério
3
Esta publicación fue muy útil cuando la pantalla de mi tableta Android se rompió y no respondía a toques. Pude "escribir" el pin usando adb shell input keyevent y encontrar el camino. ¡Gracias!
j0aqu1n
194

Actualizando:

Utilizando adb shell input:

Insertar texto:

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

(obs:% s significa ESPACIO)

..

Códigos de evento:

adb shell input keyevent 82

(82 ---> MENÚ_BOTÓN)

"Para obtener más códigos de eventos clave, consulte la lista a continuación"

..

Toque X, posición Y:

adb shell input tap 500 1450

Para encontrar la posición X, Y exacta que desea tocar, vaya a:

Configuración> Opciones de desarrollador> Marque la opción PUNTOS SLOCATION

..

Deslizar X1 Y1 X2 Y2 [duración (ms)]:

adb shell input swipe 100 500 100 1450 100

en este ejemplo X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Duración = 100ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

Utilizamos el mismo comando para deslizar para emular una pulsación larga

en este ejemplo X = 100, Y = 500, Duración = 250 ms

..

Lista actualizada de códigos de eventos:

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 lista completa de comandos se puede encontrar en: http://developer.android.com/reference/android/view/KeyEvent.html

René Barbosa
fuente
1
Esta lista es obviamente más larga para versiones posteriores de Android, por ejemplo para 4.2.2 podemos encontrarlas en android.view.KeyEvent.java , donde
suman
Gracias por el comando deslizar, lo estaba buscando mucho.
David
En las opciones de desarrollador, habilite "Ubicación del puntero" para determinar las coordenadas correctas al ingresar eventos táctiles.
Dick Lucas
Solo para información extra. ¡Deslizar solo funcionaba en mi teléfono si el tiempo era superior a 120! adb shell input swipe 200 800 200 400 200
José Rodrigues el
74

Además, si desea enviar espacios incrustados con el comando de entrada, use% s

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

rendirá

this is an example 

siendo entrada.

%en sí mismo no necesita escapar, solo el %spar especial se trata especialmente. Esto conduce, por supuesto, a la pregunta obvia de cómo ingresar la cadena literal %s... que tendría que hacer con dos comandos separados.

Fred Clift
fuente
¿Alguna forma de desactivar la corrección automática aquí? De lo contrario funciona muy bien :)
Patrick Boos
Aquí hay un script bash simple para encargarse de escapar, por lo que puede decir atext "Hey, I'm here"y funciona.
Dan Dascalescu
12

Por cierto, si está intentando encontrar una forma de enviar comillas dobles al dispositivo, intente lo siguiente:

adb shell input text '\ "'

No estoy seguro de por qué no hay un código de evento para las cotizaciones, pero esta solución hace el trabajo. Además, si está utilizando MonkeyDevice (o ChimpChat), debe probar cada caracter antes de invocar monkeyDevice.type, de lo contrario, no obtendrá nada cuando intente enviar "

H Ribeiro
fuente
1
Hice un script bash simple para encargarme de todos los escapes, por lo que puedes decir atext "Hey, I'm here"y funciona.
Dan Dascalescu
9

Otra diferencia:

  • " adb shell input " llama a input.jar para procesar y enviar el código clave desde la capa Java del marco de Android.
  • " adb sendevent " es en realidad un código c (parte de la utilidad toolbox) que envía el código de entrada directamente al / dev / input .... del subsistema de entrada de Linux.

Aquí se puede encontrar más rastreo de código detallado dentro del marco de AOSP:

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

Y_Yen
fuente
así que, en pocas palabras, sendevent es mucho más rápido que la entrada adb.
JerryGoyal
7

Escribí un script simple de Powershell para que los usuarios de Windows asignen claves a eventos de entrada de adb shell. Y controle un dispositivo Android de forma remota a través de LAN. No sé si alguien lo encuentra útil, pero lo compartiré de todos modos.

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

Si desea enviar un mensaje de texto a un dispositivo específico cuando hay varios dispositivos conectados. Primero busque los dispositivos conectados usando dispositivos adb

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

luego obtenga su ID de dispositivo específico y pruebe lo siguiente

adb -s 31002d9e592b7300 shell input text 'your text'
Karthik Bollisetti
fuente
Debería ser tu% text
royatirek
2

Para enviar una llamada de recarga a una aplicación React-Native que se ejecuta en un dispositivo Android: adb shell input keyboard text "rr"

MorenoMdz
fuente