Android 中如何添加新的键值


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

这里以imx515平台为例来说明

对keypad来说,涉及到的文件有以下几个: 

1.vendor/fsl/imx51_BBG/mxckpd.kl

首先在此文件中,添加新的键值信息:

Example:

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

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

2. kernel_imx/drivers/input/keyboard/imx51-key.c

在键盘驱动中定义相应的键盘扫描码:

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

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

(1)在数组keycodes 中添加 新定义的信息,要在{NULL, 0}之前添加

  1. static const KeycodeLabel KEYCODES[] = {   
  2. ...   
  3. ...   
  4.    { "OFFHOOK"92 },   
  5.    { "ONHOOK"93 },   
  6.    { "HANDFREE"94 },   
  7.    { "PSTNCALLIN",95 },   
  8.   
  9.    // NOTE: If you add a new keycode here you must also add it to:   
  10.    //   (enum KeyCode, in this file)   
  11.    //   frameworks/base/core/java/android/view/KeyEvent.java   
  12.    //   tools/puppet_master/PuppetMaster.nav_keys.py   
  13.    //   frameworks/base/core/res/res/values/attrs.xml   
  14.   
  15.    { NULL, 0 }   
  16. }  

(2)枚举类型 KeyCode 中添加

  1. typedef enum KeyCode {   
  2. ...   
  3. ...   
  4.    kKeyCodeOFFHOOK = 92,   
  5.    kKeyCodeONHOOK = 93,   
  6.    kKeyCodeHANDFREE = 94,   
  7.    kKeyCodePstnCallIn = 95  
  8. }KeyCode;  

4. frameworks/base/core/res/res/values/attrs.xml

添加如下:

  1. <enum name="KEYCODE_OFFHOOK" value="92" />   
  2. <enum name="KEYCODE_ONHOOK" value="93" />   
  3. <enum name="KEYCODE_HANDFREE" value="94" />   
  4. <enum name="KEYCODE_PSTNCALLIN" value="95" />  

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

  1. public static final int KEYCODE_OFFHOOK         = 92;   
  2.    public static final int KEYCODE_ONHOOK          = 93;   
  3.    public static final int KEYCODE_HANDFREE        = 94;   
  4.    public static final int KEYCODE_PSTNCALLIN      = 95;  

注意:private static final int LAST_KEYCODE    = KEYCODE_MUTE;    应改为:private static final int LAST_KEYCODE     = KEYCODE_PSTNCALLIN;

在函数 public final boolean isSystem() 中,同样需要添加:

  1. case KEYCODE_OFFHOOK:   
  2.        case KEYCODE_ONHOOK:   
  3.        case KEYCODE_HANDFREE:   
  4.        case KEYCODE_PSTNCALLIN:  

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

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

6.   frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java
综上可知,我们可以根据需求定义自己的键值,并对键值所对应的事 件信息进行合理化处理。

注:
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

相关内容