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

如何为任意Unicode字符创建Android KeyEvent?,android,android-softkeyboard,android-input-method,Android,Android Softkeyboard,Android Input Method,我在写输入法。正如您所期望的,它扩展了InputMethodService 在onCreate()中,我获得一个KeyCharacterMap: keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD); 我需要一种方法为任意Unicode字符注入幻像按键。我的第一刀看起来像这样: public void generatePhantomKeypress(char[] c) { KeyEvent[]

我在写输入法。正如您所期望的,它扩展了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键盘)

某些特定字符,当传递带有单个元素的char[]时,会导致charMap.getEvents(…)返回null,该元素的值为以下值之一:

  • 欧元符号“€”(\u20ac)
  • 英镑符号“英镑”(\u00a3)
  • 它还会阻塞重音字符,如“é”(\uc3a9)

TL/DR:给定一个值为任意Unicode值的字符,如何将其转换为KeyEvent(或KeyEvent对象序列),当传递到sendKeyEvent()时,将使Android表现为直接从虚拟键盘输入该字符?

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

如果不使用预测,是否可以使用inputConnection.commit()?(我正在创建一个IME,它使用蓝牙鼠标上的按钮输入摩尔斯电码)是的。输入连接与预测无关。它是连接到键盘的视图和键盘应用程序之间的一个通信通道。@Bitbang3r,您能分享一下最终实现的片段吗。我正在与一个类似的场景作斗争,控制字符很容易,但除了基本拉丁语和标点符号之外的任何东西似乎都无法实现。