Android:模拟文本输入(非键输入)的正确方法

Clu*_*ter 5 java keyboard android

我正在开发基于InputMethodServiceAndroid的课程。我的目标是支持硬件键盘,使其能够重新映射一些按钮,并使用不同的charmaps输入文本。

我可以重写onKeyDown方法,以便它将替换键的扫描代码:

public class Keyboard extends InputMethodService {
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        InputConnection ic = getCurrentInputConnection();
        event = new KeyEvent(event.getDownTime(), event.getEventTime(),
                event.getAction(), SOME_NEW_KEY_CODE, event
                .getRepeatCount(), event.getMetaState(), event.getDeviceId(),
                SOME_NEW_SCAN_CODE, event.getFlags());
        ic.sendKeyEvent(event);
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

它工作正常,但我无法输入任何Unicode字符。我可以使用commitText以下方式模拟文本输入:

public class Keyboard extends InputMethodService {
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        InputConnection ic = getCurrentInputConnection();
        ic.commitText("some text", 1);
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

但是它仅适用于带有文本字段的应用程序。例如Microsoft Remote Desktop之类的应用程序无法正确接收文本输入。奇怪的是,它可以接收英文字符,但不能接收西里尔字母,而屏幕键盘可以输入任何Unicode字符。

那么,哪种方法在Android中模拟文本输入最正确?