frameworks/base/data/keyboards/Generic.kl
key 189 F19
key:是关键字,固定表述,不变
189:该按键在linux驱动中对应的键值,我在这里只是假设的这个值,至于具体对应的是那个可以查看“include/linux/input.h”
F19:是Android层对应驱动层键值的标识
frameworks/native/include/input/InputEventLabels.h
将F19定义成标准键值表达
#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key }
DEFINE_KEYCODE(F19) -----> AKEYCODE_F19
frameworks/native/include/android/keycodes.h
AKEYCODE_F19 = 302,
给Android层键值标识定义一个数值键值,302是android层的键值
frameworks/base/core/res/res/values/attrs.xml
<enum name=" AKEYCODE_F19" value="302" />
定义一个全局的字符串属性值
frameworks/base/core/java/android/view/KeyEvent.java
public static final int KEYCODE_F19 = 302;
7)frameworks/base/api/current.txt添加
field public static final int KEYCODE_F15=282;//0x11a
8)framework/base/api/system-current.txt添加
field public static final int KEYCODE_F15=282;//0x11a
9)framework/base/api/test-current.txt添加
field public static final int KEYCODE_F15=282;//0x11a
经过如上的步骤就将"189"按键和Android系统中的KEYCODE_F9就对应起来了,注意这里的"189“键值并不是真正意义上的189键值,他只是linux驱动向上层抛出的键值。
在Android的framework层的键值处理函数中,捕获按键,并进行相应处理。
添加的文件是:frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
添加的具体方法:在PhoneWindowManager.java的interceptKeyBeforeQueueing()函数中,捕获该键值,至于怎么处理取决于业务。
在这里再总结下我对Android键值处理的理解,我的理解:看了一下key character map的处理,是通过读取kl文件然后使用驱动程序提供的ioctl函数去修改来自输入设备的扫描码和系统预定义的keycode的映射关系。 这样的话,对于硬件扫描码,只需要修改这个kl文件。上层得到的都是系统预定义的keycode。
重要补充:
映射关系:
ir硬件扫描码在驱动里面被 映射为 kernel/include/linux/input.h里面定义的某个键值。但是这个键值只在linux系统中使用。
Android通过源码目录下的device/xxx/xxx.kl( keylayout )文件完成linux键值到Android系统要使用的键值的映射