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


当前回答

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

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

将产生

这是一个例子

被输入。

%本身不需要转义-只有特殊的%s对被特殊处理。这当然会导致一个明显的问题,即如何输入字符串%s,这必须使用两个单独的命令来完成。

其他回答

另一个区别是:

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

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

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

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

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

将产生

这是一个例子

被输入。

%本身不需要转义-只有特殊的%s对被特殊处理。这当然会导致一个明显的问题,即如何输入字符串%s,这必须使用两个单独的命令来完成。

我为windows用户编写了一个简单的Powershell脚本,将键映射到adb shell输入事件。并通过局域网远程控制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)
    }
}

顺便说一下,如果你试图找到一种方法发送双引号到设备,尝试以下:

Adb shell输入文本“\”

我不确定为什么没有引用的事件代码,但这个解决方法可以工作。此外,如果你正在使用MonkeyDevice(或黑猩猩聊天),你应该在调用MonkeyDevice之前测试每个字符。输入,否则当你尝试发送时,你什么也得不到

向运行在android设备上的React-Native应用程序发送重载调用:adb shell input keyboard text "rr"