1. 在linux内核中实现基于input子系统的按键驱动
2. Android通过EventHub不断读取内核报告的EV_KEY*事件,然后根据key layout文件将其转换成KEYCODE_* 事件
linux内核中关于按键事件的定义在kernel/include/linux/input.h文件里,例如:
#define KEY_UP 103
android源码关于KEYCODE的定义在frameworks/base/core/java/android/view/KeyEvent.java文件里,例如:
public static final int KEYCODE_VOLUME_UP = 24;
注意,在Android平台上编写按键处理程序时,一般使用的是KEYCODE_*码
keylayout文件后缀为*.kl,这些文件在android源码device/$(company)/$(board)/目录下
当然,也可以在线直接把*.kl文件从机器上pull下来,修改之后再push上去。路径是system/usr/keylayout/目录
例如,将内核的KEY_UP事件转换成KEYCODE_VOLNUME_UP事件,可以编写keylayout文件,内容如下:
key 103 VOLUME_UP WAKE
关于keylayout文件的介绍,可以看官方介绍 ---> 点击打开链接
由于可能同时存在多个*.kl文件,具体某个event*设备和哪个*.kl文件对应,可以通过logcat查看
adb logcat | grep EventHub
I/EventHub( 1066): New device: id=9, fd=159, path='/dev/input/event0', name='device-keypad', classes=0x1, configuration='', keyLayout='/system/usr/keylayout/device-keypad.kl', keyCharacterMap='/system/usr/keychars/Generic.kcm', builtinKeyboard=true, usingSuspendBlockIoctl=false, usingClockIoctl=false
首先是以驱动的名字查找keylayout文件(例如device-keypad.kl),如果没有找到,则使用/system/usr/keylayout/qwerty.kl,最后使用默认的Generic.kl
3. Android中关于按键的APP编写
在Activity中复写dispatchKeyEvent方法:
public boolean dispatchKeyEvent(KeyEvent event){
mMsgText.setText("code:" + event.getKeyCode() + "repeat:" + event.getRepeatCount());
return true; //如果不是需要处理的按键事件,应该返回false
}
其中event.getKeyCode可以得到KEYCODE_*按键码
event.getRepeatCount可以知道这个按键按住不放多长时间,大约每隔50ms就会调用一次这个方法,Count值加1,松手此值变为0
View对象可以复写onKeyUp,onKeyDown方法。
总结:Android按键移植只需实现2步:在linux内核中编写input设备驱动,编写keylayout文件