“adb shell input text”命令模拟软键盘输入吗?

15
adb shell input text "sometext"

或者

adb shell input keyevent eventid

这些命令分别模拟来自虚拟/硬件键盘的实际输入吗?

我没有在developer.android.com上找到这些命令的任何文档。

是否有关于这些命令的可信文档?


有任何解决方案吗? - Kevin
是的,他们确实可以。当软件键盘打开时,运行 adb shell input text "something really long" 命令,你会看到按键自动输入。 (截至2020年SDK 28版本) - Nabil Freeman
5个回答

7

adb shell input help 会输出一长串输入设备列表后:

The commands and default sources are:
  text <string> (Default: touchscreen)
  keyevent [--longpress] <key code number or name> ... (Default: keyboard)
  tap <x> <y> (Default: touchscreen)
  swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
  press (Default: trackball)
  roll <dx> <dy> (Default: trackball)

所以看起来,“text”确实是用于虚拟(默认:触摸屏)输入,而keyevent用于物理(默认:键盘)输入。 您可以覆盖文本输入设备- adb shell input keyboard text "foo"非常有效。但是您不能从屏幕发送原始键代码。

这是哪个版本的Android/Input?旧版本没有列出源代码。楼主最初的问题可能没有这个选项。 - cde
@cde:我相信是Android 5.0的某个版本;我已经升级了,无法再检查了。无论如何,把我提供的命令视为信息来源——“这是操作系统所说的,不是我凭空捏造的”。我怀疑其他版本不会改变映射,即使它们没有在内置文档中提供。 - SF.

5

相关于

adb shell input text "some\ text"

我只找到了源代码: 例如,在这里可以找到 Android 8.1 的源代码。
方法private void sendText(int source, String text) {与编码有关。
在搜索用于前面方法的KeyCharacterMap.VIRTUAL_KEYBOARD时,我在这里找到了“虚拟键字符映射文件”标题下的描述。
根据这些信息,我查看了一台旧的 SM-G900F。我在/system/usr/keychars/Virtual.kcm下找到了它。 在该文件中,它将键事件映射到最常见的字符(大多数只有 ASCII)。
所以回答您的问题:

这些是否分别模拟来自虚拟/硬件键盘的实际输入?

是的,该代码接受文本并尝试通过 KeyCharacterMap.VIRTUAL_KEYBOARD 将其映射回键事件并发送它们。
根据我的经验,所有未知字符都会导致整个文本被取消。 您必须转义某些字符 - 有时使用 %s 或 '\ ' 转义空格,其他特殊字符如 & 也必须转义。 在某些设备上,我发现用adb shell input text "<longText>"输入的长文本(约 200 个字符)部分丢失 - 甚至是末尾的较大部分! 这看起来取决于制造商。

2

有一个关于adb shell input *命令的良好描述,只需输入:

adb shell input help

对于adb shell keyevent命令,可用不同的按键代码

谢谢回答,但这并没有回答问题。adb shell input - 会给出所有可能使用的选项。 - l'-'l

0

我正在开发一个工具,用于评估不同键盘之间的性能,并尝试模拟真实用户的键盘输入。我使用的工具(Android View Client)使用输入文本将文本发送到设备。然而,当使用此工具模拟文本输入时,我观察到键盘的行为存在差异,这是由于使用此输入方法引起的。

使用输入文本时,指针位置不会改变,键盘也不会显示任何按键动画。相反,当使用输入 tap X Y来按下键时,视觉行为与真实用户敲击键相同。此外,GBoard的行为对这两种输入方法也不同。当使用输入文本然后点击建议的单词时,键盘不会添加尾随空格。而使用输入 tap则不会出现这种情况。这有助于得出结论,确实存在这两种输入方法之间的差异。


-1
"

adb shell input keyevent eventid

"肯定不能模拟真实的按键事件,因为设备ID == 0。

那么"adb shell input text "sometext""呢?它毕竟不是来自物理键盘...所以我猜它会像点击软键盘一样操作?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接