How to add a new keycode in android

理解

 

Android处理Key Events和KeyCode定义,在frameworks/base/core/java/android/view/KeyEvent.java中,以及frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java中,Android自行定义了新的KeyCode。这与Linux中input.h所定义的keycode value有所不同,合理的猜测其中必然做过transfer的动作,这才能让Kernel与Androidmiddle ware以及AP相接合。描述文件在*.kl文件中,有类似如下的映射关系,这是用来做转换用的:

程序代码: [选择]

key 107   ENDCALL          WAKE_DROPPED
key 62    ENDCALL          WAKE_DROPPED
key 229   MENU             WAKE_DROPPED
key 59    MENU             WAKE_DROPPED
key 139   MENU             WAKE_DROPPED
key 127   SEARCH           WAKE_DROPPED
key 228   POUND            WAKE_DROPPED
key 227   STAR
key 231   CALL             WAKE_DROPPED
key 61    CALL             WAKE_DROPPED
key 232   DPAD_CENTER       WAKE_DROPPED
key 108   DPAD_DOWN        WAKE_DROPPED
key 103   DPAD_UP          WAKE_DROPPED
key 102   HOME             WAKE
key 105   DPAD_LEFT        WAKE_DROPPED
key 106   DPAD_RIGHT        WAKE_DROPPED
key 115   VOLUME_UP         WAKE
key 114   VOLUME_DOWN       WAKE
key 116   POWER            WAKE

KeyEvent.java,里面有一段注释说明:

程序代码: [选择]

// NOTE: If you add anew keycode here you must also add it to:
    //  isSystem()
    //  frameworks/base/include/ui/KeycodeLabels.h
    //  tools/puppet_master/PuppetMaster/nav_keys.py
    //  frameworks/base/core/res/res/values/attrs.xml
    //  commands/monkey/Monkey.java
    //  emulator?
    //
    //  Also Android currently does not reserve code rangesfor vendor-
    //  specific key codes.  If you have new key codesto have, you
    //  MUST contribute a patch to the open source projectto define
    //  those new codes.  This is intended to maintaina consistent
    //  set of key code definitions across all Androiddevices.
  
  修改按键定义: 
  development/emulator/keymaps/qwerty.kcm
  development/emulator/keymaps/qwerty.kl  
  qwerty.kcm定义了同一个按键在不同模式下输出的值

 

 

android 中如何添加新的键值

 

 

在android中,上层可使用的键值默认情况下是92个,从0-91;一般情况下,这些 键值是够用的,但是如果想扩充的话,还是需要添加新的键值的,那么如何将一个 新的键值从驱动的设置映射到上层,使应用可以对我们自定义的键值进行相应的处 理呢?

这里以imx515平台为例来说明
 对keypad来说,涉及到的文件有以下几个:

1.    build/target/board/generic_x86/keymaps/qwerty.kl (vendor/fsl/imx51_BBG/mxckpd.kl)
  首先在此文件中,添加新的键值信息:
Example:

key 59    OFFHOOK
key 60    ONHOOK
key 61    HANDFREE
key 62    PSTNCALLIN

 

scancode的值可以参考input.h中定义的键盘的扫描码


注意:新加的键值不要与已有的重复。

2.   kernel_imx/drivers/input/keyboard/imx51-key.c(待定)
在键盘驱动中定义相应的键盘扫描码

static unsigned short imx51_keypad_keycode[IMX51_KEY_NUM] =
{
   /*F1*/   1, /*PSTN*/     43, /*转移*/    8, /*1*/  9, /*6 */ 50,/***/     14, /*音量》*/ 56,
   /*F2*/   2, /*留言模式*/ 44, /*画中画*/ 45, /*2*/ 10, /*7 */ 51, /*# */   16, /*方向上*/ 17,
   /*F3*/   3, /*画面切换*/  5, /*隐私*/   46, /*3*/ 11, /*8 */ 52, /* 重播*/  53, /*方向下*/ 18,
   /*F4*/   4, /*注销*/     6, /*静音*/   47, /*4*/ 12,/*9 */ 13, /* 免提*/  54, /*方向左*/ 19,
   /*F5*/  41, /*保持*/     7, /*闪断*/   48, /*5*/ 49,/*0 */ 15, /* 音量《*/55, /*方向右*/ 20,
   /*取消*/57, /*菜单*/     58,
   /* offhook */  59,  /* onhook */ 60,  /*  免提 */61,  /* 来电 */62
};

3.     在frameworks/base/include/ui/KeycodeLabels.h

 

1)在数组keycodes 中添加 新定义的信息,

 

要在{NULL, 0}之前添加
static const KeycodeLabel KEYCODES[] = {
...
...
   { "OFFHOOK", 92 },
   { "ONHOOK", 93 },
   { "HANDFREE", 94 },
   { "PSTNCALLIN",95 },

   // NOTE: If you add a new keycode here you must also add it to:
   //   (enum KeyCode, in this file)
   //   frameworks/base/core/java/android/view/KeyEvent.java
   //   tools/puppet_master/PuppetMaster.nav_keys.py
   //   frameworks/base/core/res/res/values/attrs.xml

   { NULL, 0 }
}

 

2)枚举类型 KeyCode 中添加

 

typedef enum KeyCode {
...
...
   kKeyCodeOFFHOOK = 92,
   kKeyCodeONHOOK = 93,
   kKeyCodeHANDFREE = 94,
   kKeyCodePstnCallIn = 95
}KeyCode;


4.   frameworks/base/core/res/res/values/attrs.xml
添加如下
<enum name="KEYCODE_OFFHOOK" value="92" />
<enum name="KEYCODE_ONHOOK" value="93" />
<enum name="KEYCODE_HANDFREE" value="94" />
<enum name="KEYCODE_PSTNCALLIN" value="95" />

5. frameworks/base/core/java/android/view/KeyEvent.java

   public static final int KEYCODE_OFFHOOK        = 92;
   public static final int KEYCODE_ONHOOK         = 93;
   public static final int KEYCODE_HANDFREE       = 94;
   public static final int KEYCODE_PSTNCALLIN      =95;

 注意:      

 

(1)、private static final int LAST_KEYCODE    = KEYCODE_MUTE;
             应改为:   private static final int LAST_KEYCODE          = KEYCODE_PSTNCALLIN;

 

(2)、在函数 public final booleanisSystem() 中,同样需要添加:
       case KEYCODE_OFFHOOK:
       case KEYCODE_ONHOOK:
       case KEYCODE_HANDFREE:
       case KEYCODE_PSTNCALLIN:
  

(通过以上的更改,新的键值就添加上去了,由于更改了 KeyEvent,影响到了API,所以需要make update-api)

           如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理;
   

对于按键事件的处理一般如下文件中

 

6.  frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java和PhoneWindow.java

      综上可知,我们可以根据需求定义自己的键值,并对键值所对应的事 件信息进行合理化处理。

 

 

7、我首先在packages/apps/Visux_portal/src/com/yarin/android/Visux_portal/Visux_portal.java文件的keydown中添加相关键的处理函数,已验证该键添加成功,即在lunch界面下可以正常运行。

 

注:
     vendor/fsl/imx51_BBG/mxckpd.kl 是专门给imx515输入设备使用的keylayout文 件,所以修改mxckpd.kl 文件只是给键盘输入增加键值。如果是其他设备的输入, 如x_input,而且当没有x_iput.kl存在的时候,那么默认的kl文件就是qwerty.kl(android-root/development/emulator/keymaps/qwerty.kl)

    这个很重要。也就是说需要实现明白添加的键值是否是mxckpd.kl的input event


你可能感兴趣的:(android,null,input,menu,patch,events)