让android支持AZERTY法语键盘

来源:互联网 发布:葫芦娃摇钱树元宝算法 编辑:程序博客网 时间:2024/05/17 03:57

环境描述:

硬件:m790CB法语键盘

软件:android4.0

问题描述:

应客户需求,需要增加系统对法语外界键盘的支持,法语键盘的整体布局以及一些特殊的字符输出都是和美式键盘有所不同的。


解决方法:

不同的按键输出不同信息主要是和键盘映射文件Generic.kcm,Generic.kl有关,存在android-4.0.3_r1_dev/frameworks/base/data/keyboards目录下,首先根据AZERTY布局的法语键盘下载一份Generic.klGeneric.kcm的文件,然后根据我们实际的键盘上的键值做具体的微调。

其中Generic.kl是键盘布局文件,就是SCANCODE(十进制整数)和KEYCODE(字符串)的对应关系,第一行,表示keyboard格式,第二行,表示SCANCODE,第三行,表示KEYCODE。有关按键KEYCODE表示,网上有资料。

key1 ESCAPE

key2 1

key3 2

key4 3

key5 4

key6 5

key7 6

key8 7

key9 8

key10 9

key11 0

key12 MINUS

key13 EQUALS

key14 DEL

key15 TAB

当键盘上某个按键的输出不对时,需要修改kl文件。当按下输出错误的按键时,通过串口getevent可以得到SCANCODE的十六进制数,转换为十进制,然后修改对应的KEYCODE值。 Generic.kcm是按键映射字符文件,一个按键在不同情况下可以输出不同信息,小写,大写,数字,符号等。当某个按键和ctrlshift或者alt组合输出有误时,一般需要修改kcm文件。kcm文件内容如下:

key0 {

label,number: '0'

base: '0'

shift: ')'

ctrl,alt, meta: none

}

这是按键0的输出信息,label值和number值分别是按键标号和getNumber(上层调用)返回该键代表的数值。base值表示不按下任何其他组合键时的输出字符,shiftctrlaltmeta值分别表示他们和按键0组合输出时的字符,meta键根据法语键盘,暂时将它定为键盘上的AltGr键。

这时出现了一个问题,当按键2被按下的时候,应该是显示'é',但是,如果直接将'é'放在那个位置,是不能正确输出的。

key 2 {

label, number: '2'

base: '\u00e9'

shift: '2'

ctrl, alt: none

meta: '~'

}

原因应该是字符编码的问题,在ASCII字符编码中并没有é字符,所以它不能正确地被解析。为什么使用'\u00e9'就能够正确地显示,估计kcm文件也支持ISO8859-1 (Latin 1)编码,而在ISO8859-1中,é对应于\u00e9


相关资源参考:

HowTochange QWERTY to AZERTY for USB/Bluetooth keyboard

http://forum.xda-developers.com/showthread.php?t=1082408

按键KEYCODE表示

http://hi.baidu.com/%D0%FE%D4%C6%B7%C9/blog/item/c724a74fadafabf5d62afce9.html

ASCII/ ISO 8859-1 (Latin-1) Table with HTML Entity Names

http://cs.stanford.edu/~miles/iso8859.html