4

我创建了一个输入设备驱动程序,用于从应用程序控制鼠标/键盘。到目前为止一切正常,我可以从应用程序中为键盘和鼠标生成输入事件。

我现在面临的问题是我无法输入键盘上没有的特殊字符。如果我想输入一个 eszett (ß),我不能只为我的输入设备模拟按键。

如果我没记错的话,关键字符映射文件应该能够解决这个问题。我可以将 unicode 字符映射到某些键,然后模拟该键的按键,然后输入该字符。

我试过这个,但它不起作用,我不明白为什么它不起作用。我复制了 Virtual.kcm 文件并将其重命名为代表我的设备供应商和产品 ID。为了测试,当按下 0 键时,我替换了文件中的一行以输入 eszett 而不是“0”:

key 0 {
    label:         '\u00df'  // instead of '0'
    base:          '\u00df'  // instead of '0'
    shift:         ')'
}

通过检查“dumpsys input”的输出,我确保输入设备使用正确的 kcm 文件:

6: custom-input
  Classes: 0x8000006b
  Path: /dev/input/event5
  Descriptor: ab3fb155bce23398b91099a8f37d5cae61f29d21
  Location: 
  UniqueId: 
  Identifier: bus=0x0003, vendor=0x1111, product=0x2222, version=0x0001
  KeyLayoutFile: /system/usr/keylayout/Vendor_1111_Product_2222.kl
  KeyCharacterMapFile: /system/usr/keychars/Vendor_1111_Product_2222.kcm
  ConfigurationFile: 
  HaveKeyboardLayoutOverlay: true

到目前为止一切看起来都很好,但是当我实际使用 sendevent 生成输入事件时,它仍然输入“0”而不是 eszett。

sendevent /dev/input/event5 1 11 1  (KEY_EV, KEY_0, DOWN)
sendevent /dev/input/event5 0 0 0   (SYNC)
sendevent /dev/input/event5 1 11 0  (KEY_EV, KEY_0, UP)
sendevent /dev/input/event5 0 0 0   (SYNC)

我真的希望这能奏效,但显然它没有。有什么我想念的吗?

使用 kcm 文件(或以其他方式)通过输入设备输入 unicode 字符的解决方案是什么?

4

2 回答 2

1

“Android 目前不支持多语言键盘。此外,内置的通用键字符映射采用美式英语键盘布局。

如果 OEM 是为其他语言设计的,则鼓励 OEM 为其键盘提供自定义键字符映射。

Android 的未来版本可能会为多语言键盘或用户可选择的键盘布局提供更好的支持。”摘自https://source.android.com/devices/input/key-character-map-files.html#examples

请注意,在文档的这个片段中,它说鼓励 OEM 提供自定义键字符映射。因此,这可能是您的问题的原因。您使用的设备的 OEM(原始设备制造商)可能没有实现自定义多语言键盘支持。由于此时不需要这样做,因此您想要执行的映射可能与大多数设备不兼容,因为 eszett 不是标准英文键盘的一部分,因此不应期望支持它,除了其中一个OEM 实际上已经在他们自己的键盘实现中包含了对此的支持(请记住,Google 没有实现这一点,OEM 必须这样做)。

于 2015-09-17T16:04:16.690 回答
0

老问题,但对你们中的一些人来说可能仍然很有趣。

我发现如果您在设置中选择与“标准”不同的键盘布局,则此布局会覆盖 kcm 文件。即使这个 kcm 文件在 dumpsys 输入中列出!

如果您发现任何其他插入字符的方法,我会很感兴趣。

于 2018-06-08T09:26:11.390 回答