Android kcm文件似乎不起作用。我错过了什么?

时间:2015-09-07 13:17:40

标签: android unicode input-devices

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

我现在面临的问题是我无法输入键盘上没有的特殊字符。如果我想输入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字符的解决方案是什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

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

如果您找到任何其他方式插入字符,我会感兴趣。