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

Posted 请给我倒杯茶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 = <1>;               
  10.                  };
  11.                  vol-down-key {                       
  12.                         linux, code = <114>;                       
  13.                         label = "volume down";                       
  14.                         rockchip, adc_value = <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 = <355>;         
  26.                  };
  27.                  home-key {               
  28.                       linux, code = <102>;
  29.                       label = "home";
  30.                       rockchip, adc_value = <746>;
  31.                 };
  32.                 back-key {
  33.                       linux, code = <158>;
  34.                       label = "back";
  35.                       rockchip, adc_value = <560>;
  36.                };
  37.                camera-key {
  38.                       linux, code = <212>;
  39.                       label = "camera";
  40.                       rockchip, adc_value = <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="0" />
       ...
       <enumname="KEYCODE_TV_MEDIA_PAUSE" value="249" />
       <enum name="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:
      ...
      case KeyEvent. KEYCODE_MY_KEYS:  // 添加处理代码

 

以上是关于Android4.4.2系统添加自定义按键的主要内容,如果未能解决你的问题,请参考以下文章

Linux 输入设备 自定义键盘 input输入子系统 gpio-keys按键驱动

添加自定义字体和物理按键

安卓怎么修改虚拟键为自定义按键

Android开发技巧——设置系统状态栏颜色

Android系统中自定义按键的短按双击长按事件

Vue 自定义按键修饰符