如何为任意 Unicode 字符创建 Android KeyEvent?

How to create Android KeyEvent for arbitrary Unicode character?

我正在编写输入法。如您所料,它扩展了 InputMethodService。

在 onCreate() 中,我正在获取一个 KeyCharacterMap:

keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);

我需要一种方法来为任意 Unicode 字符注入幻像按键。我的第一次尝试看起来像这样:

public void generatePhantomKeypress(char[] c) {
    KeyEvent[] keySequence = charMap.getEvents(c);
    for (KeyEvent k : keySequence)
        getCurrentInputConnection().sendKeyEvent(k);
}

它适用于字母、数字和一些标点符号,但它似乎只适用于您可以在 PC 键盘上直接输入的字符(无需死键操作或使用 alt 键盘)。

一些特定的字符导致 charMap.getEvents(...) 到 return null 当传递一个具有单个元素的 char[] 时,其值为以下值:

TL/DR:给定一个值为任意 Unicode 值的字符,如何将其转换为 KeyEvent(或 KeyEvent 对象序列),当传递给 sendKeyEvent() 时, 会导致 Android 就像您直接从幻像键盘输入该字符一样?

通常 IME 不会生成按键事件。它通常使用 inputConnection.commit() 向应用程序发送数据。 API 采用任何 CharSequence(甚至可以包括有限的样式)。