Acara Input Shell ADB

222

Apa perbedaan mendasar antara adb shell input keyeventdan adb shell sendevent? Mana yang harus saya gunakan untuk memasukkan karakter? Apakah kode kunci sama dengan yang kita berikan pada kedua perintah?

KVR
sumber

Jawaban:

417

Oleh adb shell input keyevent, salah satu event_codeatau stringakan dikirim ke perangkat.

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

Beberapa nilai yang mungkin untuk event_codeadalah:

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"

The sendeventutilitas mengirimkan sentuh atau keyboard peristiwa, serta acara-acara lain untuk mensimulasikan peristiwa hardware. Lihat artikel ini untuk detail: Android, klik tingkat rendah shell di layar .

LionCoder
sumber
1
Hai @ chwentong! Bisakah Anda membantu saya dengan menunjuk ke tempat mana pun yang menjelaskan “teks masukan <string>” dengan cara yang lebih terperinci? Saya tidak dapat menemukan apa pun tentangnya, mirip dengan developer.android.com/reference/android/view/KeyEvent.html Terima kasih!
stansult
Hai! Bolehkah saya bertanya bagaimana saya bisa memasukkan string yang berisi ruang di konsol baris perintah windows? Saya mencoba masuk >adb shell input text "a b"tetapi tidak berhasil.
Wei Yang
1
di mana Anda mendapatkan informasi dari perintah "input"? fitur apa lagi yang disembunyikan dari dokumentasi (di sini: developer.android.com/tools/help/adb.html )?
Pengembang Android
4
@WeiYang, coba ini,> adb shell input text "a% sb"
Natan Lotério
3
Posting ini sangat membantu ketika layar tablet Android saya pecah dan tidak akan merespon sentuhan. Saya dapat "mengetik" pin dengan menggunakan adb shell input keyevent dan menemukan jalan saya. Terima kasih!
j0aqu1n
194

Memperbarui:

Menggunakan adb shell input:

Sisipkan teks:

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

(obs:% s berarti SPACE)

..

Kode acara:

adb shell input keyevent 82

(82 ---> MENU_BUTTON)

"Untuk kode keyevents lainnya lihat daftar di bawah"

..

Ketuk X, posisi Y:

adb shell input tap 500 1450

Untuk menemukan X yang tepat, posisi Y yang ingin Anda Ketuk buka:

Pengaturan> Opsi Pengembang> Periksa opsi POINTER SLOCATION

..

Geser X1 Y1 X2 Y2 [durasi (ms)]:

adb shell input swipe 100 500 100 1450 100

dalam contoh ini X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Durasi = 100ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

kami menggunakan perintah yang sama untuk geser untuk meniru pers lama

dalam contoh ini X = 100, Y = 500, Durasi = 250ms

..

Daftar Kode Kode Diperbarui:

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"

Daftar lengkap perintah dapat ditemukan di: http://developer.android.com/reference/android/view/KeyEvent.html

Rene Barbosa
sumber
1
Daftar ini jelas lebih lama untuk versi Android yang lebih baru, misalnya untuk 4.2.2 kita dapat menemukannya di android.view.KeyEvent.java , di mana jumlahnya mencapai 219.
not2qubit
Terima kasih untuk perintah swipe, saya banyak mencari itu.
David
Dalam opsi pengembang, aktifkan "Lokasi penunjuk" untuk menentukan koordinat yang benar saat memasukkan peristiwa sentuh.
Dick Lucas
Hanya untuk informasi tambahan. Gesek hanya berfungsi pada ponsel saya jika waktunya lebih besar dari 120 !! adb shell input swipe 200 800 200 400 200
Jose Rodrigues
74

Juga, jika Anda ingin mengirim ruang yang disematkan dengan perintah input, gunakan% s

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

akan menghasilkan

this is an example 

menjadi input.

%itu sendiri tidak perlu melarikan diri - hanya %spasangan khusus yang diperlakukan secara khusus. Ini tentu saja mengarah pada pertanyaan yang jelas tentang bagaimana memasukkan string literal %s... yang harus Anda lakukan dengan dua perintah terpisah.

Fred Clift
sumber
Adakah cara untuk mematikan koreksi otomatis di sini? Jika tidak berhasil :)
Patrick Boos
Berikut ini adalah skrip bash sederhana untuk mengurus pelarian, jadi Anda bisa mengatakannya atext "Hey, I'm here"dan berhasil.
Dan Dascalescu
12

Omong-omong, jika Anda mencoba menemukan cara untuk mengirim tanda kutip ganda ke perangkat, coba yang berikut ini:

adb shell input text '\ "'

Saya tidak yakin mengapa tidak ada kode acara untuk penawaran, tetapi solusi ini berhasil. Juga, jika Anda menggunakan MonkeyDevice (atau ChimpChat), Anda harus menguji setiap caracter sebelum memanggil monkeyDevice.type, jika tidak, Anda tidak akan mendapatkan apa-apa saat Anda mencoba mengirim "

H Ribeiro
sumber
1
Saya telah membuat skrip bash sederhana untuk menangani semua pelarian, jadi Anda bisa mengatakannya atext "Hey, I'm here"dan itu berhasil.
Dan Dascalescu
9

Satu perbedaan lain:

  • " adb shell input " memanggil input.jar untuk memproses dan mengirim kode kunci dari lapisan Java kerangka android.
  • " adb sendevent " sebenarnya adalah kode c (bagian dari utilitas toolbox) yang mengirimkan kode input langsung ke / dev / input .... dari subsistem input Linux.

Pelacakan kode lebih detail ke dalam AOSP Framework dapat ditemukan di sini:

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

Y_Yen
sumber
jadi singkatnya sendevent jauh lebih cepat daripada input adb!
JerryGoyal
7

Saya menulis script Powershell sederhana untuk pengguna windows untuk memetakan kunci untuk adb shell input events. Dan mengendalikan perangkat Android dari jarak jauh melalui LAN. Saya tidak tahu apakah ada yang menemukan itu berguna, tetapi saya akan membagikannya.

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

Jika Anda ingin mengirim teks ke perangkat tertentu ketika beberapa perangkat terhubung. Pertama mencari perangkat yang terpasang menggunakan perangkat adb

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

kemudian dapatkan id perangkat spesifik Anda dan coba yang berikut ini

adb -s 31002d9e592b7300 shell input text 'your text'
Karthik Bollisetti
sumber
Itu harus menjadi% teks Anda
royatirek
2

Untuk mengirim panggilan ulang ke aplikasi React-Native yang berjalan di perangkat android: adb shell input keyboard text "rr"

MorenoMdz
sumber