Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/218.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android kcm文件似乎不起作用。我错过了什么?_Android_Unicode_Input Devices - Fatal编程技术网

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

Android kcm文件似乎不起作用。我错过了什么?,android,unicode,input-devices,Android,Unicode,Input Devices,我创建了一个输入设备驱动程序,用于从应用程序控制鼠标/键盘。到目前为止一切正常,我可以在应用程序中为键盘和鼠标生成输入事件 我现在面临的问题是,我无法输入键盘上没有的特殊字符。如果我想输入一个eszettß,我不能只为我的输入设备模拟按键 如果我没有弄错的话,关键字符映射文件应该能够解决这个问题。我可以将unicode字符映射到某些键,然后模拟该键的按键,然后输入字符 我试过这个,但它不起作用,我不明白为什么它不起作用。我复制了Virtual.kcm文件并将其重命名以表示我的设备供应商和产品ID

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

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

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

如果键盘是为其他语言设计的,则鼓励原始设备制造商为其键盘提供自定义关键字符地图

Android的未来版本可能会更好地支持多语言键盘或用户可选择的键盘布局。摘自

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

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

我发现,如果在设置中选择与标准不同的键盘布局,该布局将覆盖kcm文件。即使此kcm文件列在dumpsys输入中


如果您能找到其他插入字符的方法,我会很感兴趣。

在我的特殊情况下,我是“OEM”。虽然没有涉及物理设备,但我为虚拟设备编写了驱动程序。我确实为设备的kcm文件提供了关键字符映射,但它没有完成它应该做的事情。我可能遗漏了一些东西。我明白了,我不认为我能帮上忙,因为我在hal层也做OEM,但现在你告诉我,问题可能与驱动程序有关。您是否已检查您正在使用的虚拟物理接口是否未被其他驱动程序使用?这可能是一个长期的尝试,但我现在发现android中的几个驱动程序是多路复用的,但有时由于bug,它们会相互干扰。不管怎么说,我在android上看到过很多这种情况。但是缺乏经验来帮助你做更多。我衷心祝愿你在这个问题上好运和成功。