【问题标题】:ADB Shell Input EventsADB Shell 输入事件
【发布时间】:2011-12-09 01:02:00
【问题描述】:

adb shell input keyeventadb shell sendevent 的基本区别是什么?我应该使用哪一个来输入字符?我们传递给两个命令的键码是否相同?

【问题讨论】:

    标签: android adb


    【解决方案1】:

    adb shell input keyevent 将向设备发送event_codestring

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

    event_code 的一些可能值是:

    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"
    

    sendevent 实用程序发送触摸或键盘事件,以及用于模拟硬件事件的其他事件。详情参考这篇文章:Android, low level shell click on screen

    【讨论】:

    • 嗨@chwentong!你能帮我指出任何解释“输入文本”的地方吗?我找不到任何关于它的信息,类似于 developer.android.com/reference/android/view/KeyEvent.html 谢谢!
    • 嗨!请问如何在windows命令行控制台中输入包含空格的字符串?我尝试输入&gt;adb shell input text "a b" 但不起作用。
    • 你从哪里得到“输入”命令的信息?文档中还隐藏了哪些其他功能(此处:developer.android.com/tools/help/adb.html)?
    • @WeiYang,试试这个,>adb shell input text "a%sb"
    • 当我的 Android 平板电脑的屏幕坏了,触摸没有反应时,这篇文章非常有用。我能够通过使用 adb shell input keyevent “键入” pin 并找到我的方式。谢谢!
    【解决方案2】:

    更新:

    使用adb shell input

    插入文字:

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

    (obs: %s 表示空间)

    ..

    事件代码:

    adb shell input keyevent 82
    

    (82 ---> 菜单按钮)

    “更多关键事件代码见下表”

    ..

    点按 X、Y 位置:

    adb shell input tap 500 1450
    

    要找到您想要点击的确切 X、Y 位置,请转到:

    设置 > 开发者选项 > 勾选 POINTER SLOCATION 选项

    ..

    滑动 X1 Y1 X2 Y2 [持续时间(毫秒)]:

    adb shell input swipe 100 500 100 1450 100
    

    在本例中 X1=100, Y1=500, X2=100, Y2=1450, 持续时间 = 100ms

    ..

    长按 X Y:

    adb shell input swipe 100 500 100 500 250
    

    我们使用相同的命令进行滑动来模拟长按

    在此示例中 X=100,Y=500,持续时间 = 250 毫秒

    ..

    事件代码更新列表:

    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"
    

    完整的命令列表可以在以下位置找到: http://developer.android.com/reference/android/view/KeyEvent.html

    【讨论】:

    • 这个列表对于更高版本的 Android 显然更长,例如对于 4.2.2 我们可以在android.view.KeyEvent.java 中找到它们,它们的编号高达 219。
    • 感谢滑动命令,我一直在寻找。
    • 在开发者选项中,启用“指针位置”来确定输入触摸事件时的正确坐标。
    • 仅供参考。如果时间大于 120,则滑动仅在我的手机上有效! adb shell input swipe 200 800 200 400 200
    • adb shell 输入 keyevent KEYCODE_HOME 也可以
    【解决方案3】:

    另外,如果您想通过输入命令发送嵌入的空格,请使用%s

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

    将产生

    这是一个例子

    正在输入。

    % 本身不需要转义 - 只有特殊的 %s 对被特殊处理。这当然会引出一个显而易见的问题,即如何输入文字字符串 %s,您必须使用两个单独的命令。

    【讨论】:

    • 这里有什么方法可以关闭自动更正吗?否则效果很好:)
    • 这里有一个simple bash script 来处理转义,所以你可以直接说atext "Hey, I'm here" 就可以了。
    • 你知道是否可以输入 unicode 吗?还是只有ascii?
    【解决方案4】:

    顺便说一句,如果您正试图找到一种向设备发送双引号的方法,请尝试以下操作:

    adb shell 输入文本'\"'

    我不确定为什么没有引号的事件代码,但这种解决方法可以解决问题。此外,如果您使用 MonkeyDevice(或 ChimpChat),您应该在调用 monkeyDevice.type 之前测试每个字符,否则当您尝试发送“

    【讨论】:

    • 我已经创建了一个simple bash script 来处理所有的转义,所以你可以直接说atext "Hey, I'm here" 就可以了。
    【解决方案5】:

    我为 Windows 用户编写了一个简单的 Powershell 脚本,用于将键映射到 adb shell 输入事件。并通过 LAN 远程控制 Android 设备。 不知道有没有人觉得有用,不过还是分享一下吧。

    $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)
        }
    }
    

    【讨论】:

      【解决方案6】:

      另一个区别:

      • adb shell input”正在调用input.jar来处理和发送来自android框架Java层的keycode。
      • adb sendevent”实际上是 c 代码(工具箱实用程序的一部分),将输入代码直接发送到 Linux 输入子系统的 /dev/input....。

      更详细的 AOSP 框架内部代码跟踪可以在这里找到:

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

      【讨论】:

      • 所以简而言之,sendevent 比 adb 输入快得多!
      • 这回答了 OP 问题;这是问题的直接答案。
      【解决方案7】:

      如果您想在连接多个设备时向特定设备发送文本。首先使用 adb devices

      查找连接的设备
      adb devices
      List of devices attached
      3004e25a57192200        device
      31002d9e592b7300        device
      

      然后获取您的特定设备 ID 并尝试以下操作

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

      【讨论】:

      • 应该是你的%text
      【解决方案8】:

      要向 Android 设备中运行的 React-Native 应用发送重新加载调用:adb shell input keyboard text "rr"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多