Android4.4.2系统添加自定义按键

【Android4.4.2系统添加自定义按键】丈夫志四海,万里犹比邻。这篇文章主要讲述Android4.4.2系统添加自定义按键相关的知识,希望能为你提供帮助。
本文转载自:http://developer.t-firefly.com/thread-251-1-1.html
  网上存在一些关于android系统添加自定义按键的文章,但大多针对Android2.3和4.0系统的,许多文件都已经变动位置了,这两天我总结了一些,写出来欢迎大家交流与指正:


        Android系统通过*.kl文件将Linux按键传给上层,最新的Android4.4已经不再默认qwerty.kl文件了,代之的是frameworks/base/data/keyboards/Generic.kl文件,当然如果定义板级键值文件,还是以rk29-keypad.kl文件优先。


      在3288/device/rockchip/rksdk目录下的rk29-keypad.kl文件中有相关键值的定义:

  1. key 59    MENU
  2. key 102    HOME
  3. key 114    VOLUME_DOWN
  4. key 115    VOLUME_UP
  5. key 116    POWE                    WAKE
  6. key 143    NOTIFICATION        WAKE
  7. key 158    BACK
  8. key 212    CAMERA
  9. key 217    SEARCH
复制代码

  说明: WAKE: 当设备睡眠时按下此键,设备将被唤醒,按键事件将会被发送到应用程序。 WAKE_DROPPED: 当设备睡眠时按下此键,设备将被唤醒,而按键事件不会被发送到应用程序。 
        瑞星微的按键分为GPIO和ADC两种,定义在/kernel/arch/arm/boot/dts目录下的firefly-rk3288.dts文件:
  1. & adc {           
  2.             status = "okay";
  3.             key {                   
  4.                         compatible = "rockchip, key";                    
  5.                         io-channels = < & adc 1> ;
  6.                         vol-up-key {                               
  7.                                 linux, code = < 115> ;                                
  8.                                 label = "volume up";                                
  9.                                 rockchip, adc_value = https://www.songbingjia.com/android/< 1> ;
  10.                         };
  11.                         vol-down-key {                               
  12.                                 linux, code = < 114> ;                                
  13.                                 label = "volume down";                                
  14.                                 rockchip, adc_value = https://www.songbingjia.com/android/< 170> ;
  15.                         };
  16.                         power-key {                               
  17.                                 gpios = < & gpio0 GPIO_A4 GPIO_ACTIVE_LOW> ;                                
  18.                                 linux, code = < 116> ;                            
  19.                                 label = "power";                                
  20.                                 gpio-key, wakeup;     // 具有唤醒功能                   
  21.                         };
  22.                         menu-key {                               
  23.                                 linux, code = < 139> ;                                
  24.                                 label = "menu";                                
  25.                                 rockchip, adc_value = https://www.songbingjia.com/android/< 355> ;
  26.                         };
  27.                         home-key {                   
  28.                             linux, code = < 102> ;
  29.                             label = "home";
  30.                             rockchip, adc_value = https://www.songbingjia.com/android/< 746> ;
  31.                     };
  32.                     back-key {
  33.                             linux, code = < 158> ;
  34.                             label = "back";
  35.                             rockchip, adc_value = https://www.songbingjia.com/android/< 560> ;
  36.                     };
  37.                     camera-key {
  38.                             linux, code = < 212> ;
  39.                             label = "camera";
  40.                             rockchip, adc_value = https://www.songbingjia.com/android/< 450> ;
  41.                     };            
  42.         };
复制代码        先在linux内核中添加新的按键值(当然不用宏定义直接写数值也可以),网上一般写在/include/linux/input/input.h文件中添加,实际3.10内核在/include/uapi/ linux/input.h文件中: #defineKEY_RESERVED        0 #define KEY_ESC            1 #define KEY_1                2 ... #defineKEY_MY                250 
        对于Android层次,在rk29-keypad.kl文件中增加按键值后,还需要修改一些文件,系统才能处理,首先修
改KeycodeLabels.h文件,4.4版本将其移到了frameworks/native/include/input目录下,对KEYCODES数组添加按键码:
static const KeycodeLabelKEYCODES[] = {
    ...
    { "MY_KEYS" ,250},     { NULL,0 }
            最后一定要以NULL结尾,其中的TV_KEYMOUSE_LEFT按键就是瑞星微添加的,再去frameworks/native/include/android/keycode.h文件中添加:enum {
    AKEYCODE_UNKNOWN            = 0,
    ....
    ....
添加
      AKEYCODE_MY_KEYS    =250,
        同样AKEYCODE_TV_KEYMOUSE_LEFT宏也是瑞星微添加的,如果要添加系统按键值,还需要修改 frameworks/base/libs/ui/input.java(android4.4已变为frameworks/native/libs/input/input.cpp)文件: boolKeyEvent::hasDefaultAction(int32_t keyCode) {     switch (keyCode) {             case AKEYCODE_HOME:             case AKEYCODE_BACK:             ...             case  AKEYCODE_MY_KEYS:                 return true;  
            还有下面的: boolKeyEvent::isSystemKey(int32_t keyCode) {     switch (keyCode) {             case AKEYCODE_MENU:             ...             case  AKEYCODE_MY_KEYS:                 return true;     }             return false; } 
        还要修改frameworks/base/core/java/android/view/KeyEvent.java文件:
public staticfinal int KEYCODE_TV_MEDIA_PAUSE = 249; public staticfinal int  KEYCODE_MY_KEYS            = 250; private staticfinal int LAST_KEYCODE = KEYCODE_MY_KEYS;
        注意一定要修改LAST_KEYCODE,下面的populateKeycodeSymbolicNames数组也需要添加: names.append(KEYCODE_MY_KEYS, " KEYCODE_MY_KEYS ");  
        修改frameworks/base/core/res/res/values/attr.xml文件: < !--This enum provides the same keycode values as can be found in        {@link android.view.KeyEvent}. --> < attrname="keycode">         < enum name="KEYCODE_UNKNOWN"value="https://www.songbingjia.com/android/0" />         ...         < enumname="KEYCODE_TV_MEDIA_PAUSE" value="https://www.songbingjia.com/android/249" />         < enum name="KEYCODE_MY_KEYS" value="https://www.songbingjia.com/android/250" /> < /attr>  
        对于网上说的/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h文件已经移除。 
        以上文件都改完之后frameworks/base/api/current.txt也要随之更新,如果未更新,可运行  makeupdate-api 进行更新         如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理。对于按键事件的处理一般如下文件中:
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java 
@Override    public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn) {     ...     switch (keyCode) {         case KeyEvent.KEYCODE_VOLUME_DOWN:         ...         case KeyEvent.  KEYCODE_MY_KEYS:    // 添加处理代码 

    推荐阅读