Eventos de entrada do ADB Shell

222

Qual é a diferença básica entre adb shell input keyevente adb shell sendevent? Qual devo usar para inserir um caractere? Os códigos de chave são os mesmos que passamos para os dois comandos?

KVR
fonte

Respostas:

417

Por adb shell input keyevent, um event_codeou um stringserá enviado para o dispositivo.

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

Alguns valores possíveis para event_codesão:

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"

O sendeventutilitário envia eventos de toque ou teclado, bem como outros eventos para simular os eventos de hardware. Consulte este artigo para obter detalhes: Android, clique em shell de baixo nível na tela .

LionCoder
fonte
1
Oi @chwentong! Você pode me ajudar a apontar para qualquer lugar que explique “texto de entrada <string>” de maneira mais detalhada? Não consigo encontrar nada sobre isso, semelhante ao developer.android.com/reference/android/view/KeyEvent.html Obrigado!
stansult
Oi! Posso perguntar como posso inserir a string que contém espaço em um console de linha de comando do Windows? Eu tento entrar, >adb shell input text "a b"mas não trabalho.
Wei Yang
1
onde você conseguiu as informações do comando "input"? que outros recursos estão ocultos da documentação (aqui: developer.android.com/tools/help/adb.html )?
desenvolvedor android
4
@WeiYang, tente isso,> adb shell texto de entrada "um sb%"
Natan Lotério
3
Esta postagem foi muito útil quando a tela do meu tablet Android quebrou e não respondeu a toques. Consegui "digitar" o pino usando o evento de chave de entrada do shell adb e encontrar meu caminho. Obrigado!
j0aqu1n
194

Atualizando:

Usando adb shell input:

Inserir texto:

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

(obs:% s significa ESPAÇO)

..

Códigos de evento:

adb shell input keyevent 82

(82 ---> MENU_BUTTON)

"Para mais códigos de eventos-chave, veja a lista abaixo"

..

Toque na posição X, Y:

adb shell input tap 500 1450

Para encontrar a posição exata X, Y que você deseja tocar, vá para:

Configurações> Opções do desenvolvedor> Marque a opção SLOCATION DO PONTEIRO

..

Passe o dedo X1 Y1 X2 Y2 [duração (ms)]:

adb shell input swipe 100 500 100 1450 100

neste exemplo X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Duração = 100ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

utilizamos o mesmo comando para um furto emular uma pressão longa

neste exemplo X = 100, Y = 500, Duração = 250ms

..

Lista atualizada de códigos de 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"

A lista completa de comandos pode ser encontrada em: http://developer.android.com/reference/android/view/KeyEvent.html

Rene Barbosa
fonte
1
Esta lista é, obviamente, mais para versões posteriores do Android, por exemplo, para 4.2.2, podemos encontrá-los em android.view.KeyEvent.java , onde número até 219.
not2qubit
Obrigado pelo comando de furto, eu estava pesquisando muito isso.
David
Nas opções do desenvolvedor, ative "Localização do ponteiro" para determinar as coordenadas corretas ao inserir eventos de toque.
Dick Lucas
Apenas para informações extras. Swipe só funcionou no meu telefone se o tempo fosse maior que 120 !! adb shell input swipe 200 800 200 400 200
Jose Rodrigues
74

Além disso, se você desejar enviar espaços incorporados com o comando de entrada, use% s

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

vai render

this is an example 

sendo entrada.

%ele próprio não precisa escapar - apenas o %spar especial é tratado especialmente. É claro que isso leva à pergunta óbvia de como inserir a string literal %s... o que você faria com dois comandos separados.

Fred Clift
fonte
Alguma maneira de desativar a correção automática aqui? Caso contrário, funciona muito bem :)
Patrick Boos
Aqui está um script bash simples para cuidar da fuga, para que você possa dizer atext "Hey, I'm here"e funciona.
Dan Dascalescu 15/10
12

A propósito, se você estiver tentando encontrar uma maneira de enviar aspas duplas para o dispositivo, tente o seguinte:

texto de entrada do shell adb '\ "'

Não sei por que não há código de evento para aspas, mas essa solução alternativa faz o trabalho. Além disso, se você estiver usando o MonkeyDevice (ou ChimpChat), deverá testar cada caractere antes de chamar monkeyDevice.type, caso contrário, você não receberá nada ao tentar enviar "

H Ribeiro
fonte
1
Eu criei um script bash simples para cuidar de toda a fuga, para que você possa dizer atext "Hey, I'm here"e funciona.
Dan Dascalescu 15/10
9

Outra diferença:

  • " adb shell input " está chamando o input.jar para processar e enviar o código-chave da camada Java da estrutura do Android.
  • " adb sendevent " é realmente o código c (parte do utilitário da caixa de ferramentas) que envia o código de entrada diretamente para o / dev / input .... do subsistema de entrada do Linux.

Um rastreamento de código mais detalhado no AOSP Framework pode ser encontrado aqui:

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

Y_Yen
fonte
Então, em poucas palavras, sendevent é muito mais rápido que adb input!
precisa saber é o seguinte
7

Eu escrevi um script simples do Powershell para usuários do Windows para mapear chaves para eventos de entrada de shell adb. E controle um dispositivo Android remotamente pela LAN. Não sei se alguém acha útil, mas vou compartilhar de qualquer maneira.

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

Se você deseja enviar um texto para um dispositivo específico quando vários dispositivos estiverem conectados. Primeiro, procure os dispositivos conectados usando dispositivos adb

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

obtenha seu ID de dispositivo específico e tente o seguinte

adb -s 31002d9e592b7300 shell input text 'your text'
Karthik Bollisetti
fonte
Ele deve ser sua% texto
royatirek
2

Para enviar uma chamada de recarga para um aplicativo React-Native em execução em um dispositivo Android: adb shell input keyboard text "rr"

MorenoMdz
fonte