Android物理输入事件(二)

Android物理按键输入事件(一)

本篇文章主要分析Android系统新增物理按键在framework层的修改

1.添加按键及其映射

   上篇中我们知道kernel最终是通过kl文件给 user space的上报了一个整数,但是怎样确定这个kl文件. 这里可以通过如下命令查看:

> cat /proc/bus/input/devices

Android物理输入事件(二)_第1张图片

通过打印信息,我们知道设备使用的是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”值

Android物理输入事件(二)_第2张图片

3.在frameworks/native/include/android/keycodes.h中修改

Android物理输入事件(二)_第3张图片

4.修改frameworks/base/core/res/res/values/attrs.xml

Android物理输入事件(二)_第4张图片

5.修改frameworks/base/core/java/android/view/KeyEvent.java

Android物理输入事件(二)_第5张图片

经过如上步骤就将 123 按键 和系统中的 KEYCODE_WIFI 对应起来了,注意这里的"123“键值并不是真正意义上的123键值,他只是linux驱动向上层抛出的键值

6.在Android的framework层的键值处理函数中,捕获按键,并进行相应处理

    在framework层的input系统中,加入对wifi按键的捕获

frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

添加的具体方法:在PhoneWindowManager.javainterceptKeyBeforeQueueing()函数中,捕获该键值,至于怎么处理处决您的业务处理了。

在这里再总结下我对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系统要使用的键值的映射

你可能感兴趣的:(Android物理输入事件(二))