ADB Shell输入Unicode字符

16

在了解ADB Shell输入事件中描述的基本按键映射后,我成功地模拟了文本输入和特殊键。但是对于Unicode字符怎么办?例如,我想使用德语QWERTZ键盘布局中的umlauts。

这样做:

$ adb shell input text ö
Killed

所以它似乎会崩溃和

adb shell input text \xFC

在输入上打印 xFC。 我尝试过使用 getevent 捕捉事件,但我没有找到直接的映射,我也查看了键映射文件 /system/usr/keylayout/Qwerty.kl

我相信唯一的可能性是通过剪贴板,但正如在问题Pasting text into Android emulator clipboard using adb shell中指出的那样,似乎不知道如何在Android Ice Cream Sandwich或更高版本中使用它。

3个回答

24
我编写了一个虚拟键盘,可以接受广播意图,因此您可以通过adb发送Unicode字符到editText视图中。
例如: adb shell am broadcast -a ADB_INPUT_TEXT --es msg "你好嗎!Hello!"
这是Github项目的链接: https://github.com/senzhk/ADBKeyBoard 希望这个小项目能有所帮助。

非常感谢您修补了 Android 中的一个缺陷。您是真正的 MVP! - y_nk

10

实际上ADBKeyBoard非常好用!感谢Eric Tang!

以下是一些便于使用的扩展:

从adb切换到ADBKeyBoard:

   adb shell ime set com.android.adbkeyboard/.AdbIME   

检查您可用的虚拟键盘:

ime list -a  

如果你的shell不接受"!"(解释符号),请使用简单引号字符,而不是像上面的例子中那样使用双引号。

adb shell am broadcast -a ADB_INPUT_TEXT --es msg 'Accented characters here'

切换回原始虚拟键盘:(在我的情况下是Swype…)

adb shell ime set com.nuance.swype.dtc/com.nuance.swype.input.IME  

使用无线adb简化您的生活... :)

3
需要在设备上安装该应用程序。难道没有使用"adb"本身实现它的方法吗? - android developer
谢谢,我之前不知道adb可以通过WIFI连接,这对我帮助很大。 - zw963

3

input无法正常工作,因为它只能通过虚拟键盘发送单个按键事件(如果你不知道我的意思,请检查源代码)。

我认为剩下的唯一方法是使用 Instrumentation 。我猜你可以为你的 Activity 创建一个测试,然后像这样做:

                final Instrumentation instrumentation = getInstrumentation();
                final long downTime = SystemClock.uptimeMillis();
                final long eventTime = SystemClock.uptimeMillis();
                
                final KeyEvent altDown = new KeyEvent(downTime, eventTime, KeyEvent.ACTION_DOWN,
                        KeyEvent.KEYCODE_GRAVE, 1, KeyEvent.META_ALT_LEFT_ON);
                final KeyEvent altUp = new KeyEvent(downTime, eventTime, KeyEvent.ACTION_UP,
                        KeyEvent.KEYCODE_GRAVE, 1, KeyEvent.META_ALT_LEFT_ON);
                
                instrumentation.sendKeySync(altDown);
                instrumentation.sendCharacterSync(KeyEvent.KEYCODE_A);
                instrumentation.sendKeySync(altUp);
                instrumentation.sendKeySync(altDown);
                instrumentation.sendCharacterSync(KeyEvent.KEYCODE_E);
                instrumentation.sendKeySync(altUp);
                instrumentation.sendKeySync(altDown);
                instrumentation.sendCharacterSync(KeyEvent.KEYCODE_I);
                instrumentation.sendKeySync(altUp);
                instrumentation.sendKeySync(altDown);
                instrumentation.sendCharacterSync(KeyEvent.KEYCODE_O);
                instrumentation.sendKeySync(altUp);
                instrumentation.sendKeySync(altDown);
                instrumentation.sendCharacterSync(KeyEvent.KEYCODE_U);
                instrumentation.sendKeySync(altUp);

这将发送修改后的按键:àèìòù

2022年更新

https://dev59.com/5m865IYBdhLWcg3wHKzu#71367206 展示了另一种使用 AndroidViewClient/culebraCulebraTester2-public 后端的解决方案。


虽然这似乎适用于您列出的重音字母,但我认为它不适用于德语umlauts,例如äöü。您知道要使用哪些键组合来生成这些字符吗? - FD_
1
@FD_ 你好,终于找到答案了。首先,在这个页面 Key Map 上,你可以了解到组合变音死键字符的 Unicode 编码。'\u0300': 重音符号。à'\u0301': 尖音符号。á'\u0302': 抑扬符号。â'\u0303': 波浪符号。ã'\u0308': 两点符号。ä而在这个页面 Virtual.kcm 上,你可以了解到如何构建 Unicode 编码。 - Shawn.G

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