Android物理输入事件(二)
本篇文章主要分析Android系统新增物理按键在framework层的修改
1.添加按键及其映射
上篇中我们知道kernel最终是通过kl文件给 user space的上报了一个整数,但是怎样确定这个kl文件. 这里可以通过如下命令查看:
> cat /proc/bus/input/devices
通过打印信息,我们知道设备使用的是Vendor_0001_Product_0001.kl(sunxi-keyboard.kl).我们继续查看这个文件里面的内容
2.在sunxi-keyboard.kl文件中添加映射
key 123 WIFI
说明:
key -------关键字. 不要改动
123 -------kernel中上报的键值.这里只是假设这个这.具体需要请参考:include/linux/input.h
WIFI -------123按键映射到Android中的按键,它对应的是 KeycodeLabels.h (Android 6.0:InputEventLabels.h)文件中的KEYCODES表格元素的“literal”值
3.在frameworks/native/include/android/keycodes.h中修改
4.修改frameworks/base/core/res/res/values/attrs.xml
5.修改frameworks/base/core/java/android/view/KeyEvent.java
经过如上步骤就将 123 按键 和系统中的 KEYCODE_WIFI 对应起来了,注意这里的"123“键值并不是真正意义上的123键值,他只是linux驱动向上层抛出的键值
6.在Android的framework层的键值处理函数中,捕获按键,并进行相应处理
在framework层的input系统中,加入对wifi按键的捕获
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java
添加的具体方法:在PhoneWindowManager.java的interceptKeyBeforeQueueing()函数中,捕获该键值,至于怎么处理处决您的业务处理了。
在这里再总结下我对Android键值处理的理解,我的理解:看了一下key character map的处理,是通过读取kl文件然后使用驱动程序提供的ioctl函数去修改来自输入设备的扫描码和系统预定义的keycode的映射关系。 这样的话,对于硬件扫描码,只需要修改这个kl文件。上层得到的都是系统预定义的keycode。
补充: 在编译固件时需要先更新一下api:make update-api
映射关系:
ir硬件扫描码在驱动里面被 映射为 kernel/include/linux/input.h里面定义的某个键值。但是这个键值只在linux系统中使用。
Android通过源码目录下的device/xxx/xxx.kl( keylayout )文件完成linux键值到Android系统要使用的键值的映射