网上存在一些关于Android系统添加自定义按键的文章,但大多针对Android2.3和4.0系统的,许多文件都已经变动位置了,这两天我总结了一些,写出来欢迎大家交流与指正:


文件,当然如果定义板级键值文件,还是以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. 
    4.           key {               
    5.                  compatible = "rockchip, key";               
    6.                  io-channels = <&adc 1>;
    7. 
    8.                  vol-up-key {                       
    9.                          linux, code = <115>;                       
    10.                          label = "volume up";                       
    11.                          rockchip, adc_value = <1>;               
    12.                  };
    13. 
    14.                  vol-down-key {                       
    15.                         linux, code = <114>;                       
    16.                         label = "volume down";                       
    17.                         rockchip, adc_value = <170>;               
    18.                  };
    19.                  power-key {                        
    20.                        gpios = <&gpio0 GPIO_A4 GPIO_ACTIVE_LOW>;                        
    21.                        linux, code = <116>;                     
    22.                        label = "power";                       
    23.                        gpio-key, wakeup;  // 具有唤醒功能               
    24.                  };
    25. 
    26.                  menu-key {                        
    27.                        linux, code = <139>;                        
    28.                        label = "menu";                       
    29.                        rockchip, adc_value = <355>;         
    30.                  };
    31.                  home-key {               
    32.                       linux, code = <102>;
    33.                       label = "home";
    34.                       rockchip, adc_value = <746>;
    35.                 };
    36.                 back-key {
    
    37.                       linux, code = <158>;
    38.                       label = "back";
    39.                       rockchip, adc_value = <560>;
    40.                };
    41.                camera-key {
    
    42.                       linux, code = <212>;
    43.                       label = "camera";
    44.                       rockchip, adc_value = <450>;
    45.               };         
    46.       };



           先在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




           同样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:



            ...



    AKEYCODE_MY_KEYS:



                return true;



     



            还有下面的:



    boolKeyEvent::isSystemKey(int32_t keyCode) {



        switch (keyCode) {



            case AKEYCODE_MENU:



            ...



    AKEYCODE_MY_KEYS:



                return true;



        }



            return false;



    }



     



           还要修改frameworks/base/core/java/android/view/KeyEvent.java文件:
    public staticfinal int KEYCODE_TV_MEDIA_PAUSE = 249;



    KEYCODE_MY_KEYS



    private staticfinal int LAST_KEYCODE = KEYCODE_MY_KEYS;




           注意一定要修改LAST_KEYCODE,下面的populateKeycodeSymbolicNames数组也需要添加:



    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="0" />



           ...



           <enumname="KEYCODE_TV_MEDIA_PAUSE" value="249" />



    KEYCODE_MY_KEYS" value="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:



          ...



    KEYCODE_MY_KEYS:  // 添加处理代码