Sự kiện đầu vào của ADB Shell


222

Sự khác biệt cơ bản giữa adb shell input keyeventvà là adb shell sendeventgì? Tôi nên sử dụng cái nào để nhập ký tự? Các mã khóa có giống nhau mà chúng ta truyền cho cả hai lệnh không?

Câu trả lời:


417

Bởi adb shell input keyevent, một event_codehoặc một stringsẽ được gửi đến thiết bị.

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

Một số giá trị có thể event_codelà:

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"

Các sendeventtiện ích gửi cảm ứng hoặc bàn phím các sự kiện, cũng như các sự kiện khác để mô phỏng các sự kiện phần cứng. Tham khảo bài viết này để biết chi tiết: Android, nhấp vào vỏ cấp thấp trên màn hình .


1
Xin chào @chwentong! Bạn có thể vui lòng giúp tôi chỉ vào bất kỳ nơi nào giải thích văn bản nhập vào <chuỗi> cách chi tiết hơn không? Tôi không thể tìm thấy bất cứ điều gì về nó, tương tự như developer.android.com/reference/android/view/KeyEvent.html Cảm ơn!
stansult

Chào! Tôi có thể hỏi làm thế nào tôi có thể nhập chuỗi chứa không gian trong bảng điều khiển dòng lệnh windows? Tôi cố gắng vào >adb shell input text "a b"nhưng không hoạt động.
Wei Yang

1
bạn đã lấy thông tin của lệnh "đầu vào" ở đâu? những tính năng nào khác được ẩn khỏi tài liệu (ở đây: developer.android.com/tools/help/adb.html )?
nhà phát triển Android

4
@WeiYang, hãy thử điều này,> văn bản nhập vào vỏ adb "a% sb"
Natan Lotério

3
Bài đăng này rất hữu ích khi màn hình máy tính bảng Android của tôi bị vỡ và nó sẽ không phản hồi khi chạm vào. Tôi đã có thể "nhập" mã pin bằng cách sử dụng khóa đầu vào vỏ adb và tìm đường đi. Cảm ơn!
j0aqu1n

194

Đang cập nhật:

Sử dụng adb shell input:

Chèn văn bản:

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

(obs:% s có nghĩa là KHÔNG GIAN)

..

Mã sự kiện:

adb shell input keyevent 82

(82 ---> MENU_BUTTON)

"Để biết thêm mã khóa, xem danh sách bên dưới"

..

Nhấn vào vị trí X, Y:

adb shell input tap 500 1450

Để tìm vị trí X, Y chính xác mà bạn muốn Nhấn vào:

Cài đặt> Tùy chọn nhà phát triển> Kiểm tra tùy chọn POINTER SLOCATION

..

Vuốt X1 Y1 X2 Y2 [thời gian (ms)]:

adb shell input swipe 100 500 100 1450 100

trong ví dụ này X1 = 100, Y1 = 500, X2 = 100, Y2 = 1450, Thời lượng = 100ms

..

LongPress XY:

adb shell input swipe 100 500 100 500 250

chúng tôi sử dụng cùng một lệnh để vuốt để mô phỏng một báo chí dài

trong ví dụ này X = 100, Y = 500, Thời gian = 250ms

..

Danh sách mã sự kiện được cập nhật:

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"

Danh sách đầy đủ các lệnh có thể được tìm thấy trên: http://developer.android.com/reference/android/view/KeyEvent.html


1
Danh sách này rõ ràng dài hơn cho các phiên bản Android mới hơn, ví dụ như cho 4.2.2, chúng ta có thể tìm thấy chúng trong android.view.KeyEvent.java , trong đó chúng có số lượng lên tới 219.
not2qubit 14/03/2015

Cảm ơn lệnh vuốt, tôi đã tìm kiếm nó rất nhiều.
David

Trong tùy chọn nhà phát triển, bật "Vị trí con trỏ" để xác định tọa độ chính xác khi nhập các sự kiện chạm.
Dick Lucas

Chỉ để biết thêm thông tin. Vuốt chỉ hoạt động trên điện thoại của tôi nếu thời gian lớn hơn 120 !! adb shell input swipe 200 800 200 400 200
Jose Coleues

74

Ngoài ra, nếu bạn muốn gửi khoảng trắng được nhúng bằng lệnh đầu vào, hãy sử dụng% s

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

sẽ mang lại

this is an example 

được đầu vào.

%bản thân nó không cần thoát - chỉ có %scặp đặc biệt được đối xử đặc biệt. Tất nhiên, điều này dẫn đến câu hỏi rõ ràng về cách nhập chuỗi ký tự %s... mà bạn sẽ phải làm với hai lệnh riêng biệt.


Bất kỳ cách nào để tự động tắt chính xác ở đây? Nếu không thì hoạt động rất tốt :)
Patrick Boos

Đây là một tập lệnh bash đơn giản để xử lý thoát, vì vậy bạn chỉ cần nói atext "Hey, I'm here"và nó hoạt động.
Dan Dascalescu

12

Nhân tiện, nếu bạn đang cố gắng tìm cách gửi báo giá kép cho thiết bị, hãy thử cách sau:

văn bản đầu vào vỏ adb '\ "'

Tôi không chắc tại sao không có mã sự kiện để trích dẫn, nhưng cách giải quyết này thực hiện công việc. Ngoài ra, nếu bạn đang sử dụng MonkeyDevice (hoặc ChimpChat), bạn nên kiểm tra từng loại vi khuẩn trước khi gọi khỉDevice.type, nếu không bạn sẽ không nhận được gì khi cố gắng gửi "


1
Tôi đã tạo một kịch bản bash đơn giản để xử lý tất cả các lối thoát, vì vậy bạn chỉ cần nói atext "Hey, I'm here"và nó hoạt động.
Dan Dascalescu

9

Một sự khác biệt khác:

  • " Adb shell input " đang gọi input.jar để xử lý và gửi mã khóa từ lớp Java của khung công tác Android.
  • " adb sendevent " thực sự là mã c (một phần của tiện ích hộp công cụ) gửi mã đầu vào trực tiếp vào / dev / input .... của hệ thống con đầu vào Linux.

Chi tiết theo dõi mã vào bên trong AOSP Framework có thể được tìm thấy ở đây:

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


Vì vậy, tóm lại, sendevent là cách nhanh hơn so với đầu vào adb!
JerryGidel

7

Tôi đã viết một tập lệnh Powershell đơn giản cho người dùng windows để ánh xạ các khóa tới các sự kiện nhập vào vỏ adb. Và điều khiển một thiết bị Android từ xa qua mạng LAN. Tôi không biết có ai thấy nó hữu ích không, nhưng dù sao tôi cũng sẽ chia sẻ nó.

$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

Nếu bạn muốn gửi một văn bản đến thiết bị cụ thể khi nhiều thiết bị được kết nối. Trước tiên hãy tìm các thiết bị đính kèm bằng thiết bị adb

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

sau đó lấy id thiết bị cụ thể của bạn và thử các cách sau

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

Nó phải là% văn bản của bạn
royatirek

2

Để gửi cuộc gọi tải lại đến ứng dụng React-Native đang chạy trong thiết bị Android: adb shell input keyboard text "rr"

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.