按键从Linux到Android -Android篇

Android4.1添加新的按键

添加新的物理按键 DECT_REGISTER, DECT_PHONE
1.kl文件添加按键码映射,251,252 是 驱动上报上来的键值,该键值对应驱动里面的code设定,DECT_REGISTER字符串对应keycodeLabels.h中的字符窜,这样就把驱动传递上来的key键消息和android系统的key处理连接起来了.*.kl文件的具体说明参见该专题系列博客的第一篇.
key 251 DECT_REGISTER
key 252 DECT_PHONE
2.frameworks/base/include/androidfw/KeycodeLabels.h
 对KEYCODES,添加按键码,添加的字符窜DECT_REGISTER是上面*.kl文件中的,保持两者一致,后面的220数值和前面驱动传递上来的251没有任何换算关系,在取值方面考虑Android未使用的Code为准,这个220将来在Android App中的对应按键KeyUp(int keyCode,...),KeyDown(int keyCode,...)处理时获得的KeyCode相对应,这样就把Android中间层与Android应用层链接起来了,不过Android中间层还需要修改其他几个文件.参见该专题的第一篇.
static const KeycodeLabel KEYCODES[] = {
...
 { "DECT_REGISTER",220},
 { "DECT_PHONE",221},
3.frameworks/base/core/res/res/values/attr.xml
< enum name="KEYCODE_DECT_REGISTER" value="220"/>
< enum name="KEYCODE_DECT_PHONE" value="221"/>
4.frameworks/native/include/android/keycode.h
enum {
    AKEYCODE_UNKNOWN         = 0,
    ....
    ....
添加
AKEYCODE_DECT_REGISTER   =220,
AKEYCODE_DECT_PHONE      =221,
5.frameworks/base/core/java/android/view/KeyEvent.java
添加
 public static final int KEYCODE_DECT_REGISTER=   220;
 public static final int KEYCODE_DECT_PHONE=221;
修改 LAST_KEYCODE  和 KEYCODE_SYMBOLIC_NAMES
private static final int LAST_KEYCODE           = KEYCODE_DECT_REGISTER;
// NOTE: If you add a new keycode here you must also add it to:
//  isSystem()
//  native/include/android/keycodes.h
//  frameworks/base/include/ui/KeycodeLabels.h
//  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
//  frameworks/base/core/res/res/values/attrs.xml
//  emulator?
//  LAST_KEYCODE
//  KEYCODE_SYMBOLIC_NAMES
private static void populateKeycodeSymbolicNames() {
        SparseArray names = KEYCODE_SYMBOLIC_NAMES;
        names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");
        ...
        ...
        names.append(KEYCODE_DECT_REGISTER, "KEYCODE_DECT_REGISTER");
        names.append(KEYCODE_DECT_PHONE, "KEYCODE_DECT_PHONE");
}
修改 isSystem(),追踪jni需要修改frameworks/base/lib/androidrw/input.cpp  KeyEvent::isSystemKey
bool KeyEvent::isSystemKey(int32_t keyCode) {
    switch (keyCode) {
        ....
        case AKEYCODE_DECT_REGISTER:
        case AKEYCODE_DECT_PHONE:
            return true;
    }   
    return false;
}
6.external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h(这一步不是必须的,应设备而定,文章两个按键是DECT,所以和电话机相关系,所以添加在下面进行了测试)
修改
   enum ANPKeyCodes {
    kUnknown_ANPKeyCode = 0,
   ...
   ...
   kDectRegister_ANPKeyCode=220,
   kDectPhone_ANPKeyCode=221,
}
以上修改完成后,可以在PhoneWindowManager 测试下这个两个键是否成功上报,如果上报成功,就可以在自己的应用中添加与这个按键相关的逻辑处理。

 

给个参考流程图:

用户APP Component
            |
     TextKeyListener/MultiTapListener
             |
        ACTIVITY
             |
       发到VIEW
               |
       Dispatch to IME (先发到输入法)
                |
        ViewRoot
                 |
WindowManagerService(PhoneWindowManager拦截一些KEY)
                 |
Framework input service( inputdispatch/inputRead)
                 |
 Kernel driver[/dev/input(x)]

 

转自 : http://blog.csdn.net/lsdmx2016/article/details/8606856
红色字体部分为转载博主所注解

 另外还有一篇关于wifi添加按键的文章 : http://www.cnblogs.com/skywang12345/p/3142851.html

 

 

 

你可能感兴趣的:(按键从Linux到Android -Android篇)