Android按键移植

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文件




你可能感兴趣的:(android移植)