Android增加(键盘)按键

休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述Android增加(键盘)按键相关的知识,希望能为你提供帮助。
 
以添加 camera按键为例(红色是需要添加的)
一、kernel键值定义
(1)键扫描码
ScanCode是由linux的Input驱动框架定义的整数类型,可参考input.h头文件,即getevent得到的键值。
  #define KEY_Q 16
#define KEY_W 17
#define KEY_E 18
#define KEY_R 19
#define KEY_T 20
      #define KEY_CAMERA  199
(2)键盘布局文件(*.kl)
  将input event报的键值转换成具体键盘对应的按键供android上层使用,时通过键盘布局文件(*.kl)完成转换的。放在/system/usr/keylayout/下面
而qwert.kl中定义如下:
        ScanCode + 字符串值        
key 16     Q
key 17     W
key 18     E
key 19     R
key 20     T
    其中ScanCode 是驱动报的值(即驱动input.h中定义的键值 )
A:添加kl文件:
abcxxxx.kl(文件名须与input 的device设备的name一致)
    Key  199   CAMERA
【199为 驱动定义的scanCode ,CAMERA 为Android中 KEYCODES[]定义按键对应的keylabel字符】
注:
1kl文件须与键盘输入的input devic 的名称一致,否则EventHub在加载设备时因找不到对应的kl 而加载默认的qwert.kl,导致键值转换错误
2kl中的scanCode android 中定义的keylabel字符必须对应,否则会转换错误。keyMapper在转换时是根据scanCode,来确定对应的按键字符,再根据此字符在KEYCODES中的位置来确定对应android中的键值。
 
B:kl文件添加到system
将kl文件(通常)放在/device/qcom/XXX/(XXX为项目名称)
(1) AndroidBoard.mk 添加:
include $(CLERA_VARS)
LOCAL_MODULE                                      :=  abcxxxx.kl
LOCAL_MODULE_TARGS        := optional    eng
LOCAL_MODULE_CLASS          := ETC
LOCAL_SRC_FILES                                  := $(LOCAL_MODULE)
LOCAL_MODULE_PATH            := $(TARGET_OUT_KEYLAYOUT)
include $(BUILD_PREBUILT)
(2)/device/qcom/common/base.mk添加
KEYPAD  +=  abcxxxx.kl
注:不加会导致kl文件不被打包进/system/usr/keylayout/
   
二、Android 中添加按键
(1)定义按键对应的key label
    在KEYCODES[]数组的最后添加按键的key label,
即:
static const KeycodeLabel KEYCODES[] = {
      …
DEFINE_KEYCODE(HELP)
DEFINE_KEYCODE(CAMERA )
};
 
注:
位置
Android 4.4 以前版本  frameworks/base/include/ui/KeycodeLabels.h
Android 4.4 在framework/native/include/input/KeyCodelabels.h
Android5.0 以后在framework/native/include/input/InputEventLabels.h
 
(2)定义keyCode
A: native 定义(keycodes.h)
enum {
… … …
      AKEYCODE_HELP                 = 259,
      AKEYCODE_CAMERA = 260
};
注:
1)位置:frameworks/base/include/android/keycodes.h
2)此处keycode的定义的值即是 上面key label定义在KEYCODES数组中的位置(index),否则会映射错误
 
B:JAVA 定义(KeyEvent.java定义键值)
  public static final int KEYCODE_HELP               = 259;
  public static final int KEYCODE_CAMERA     = 260;
 
修改LAST_KEYCODE
private static final int LAST_KEYCODE                    = KEYCODE_CAMERA;
 
注:
1)位置:frameworks/base/core/java/android/view/KeyEvent.java
2)此处的key code必须与native定义的一致
 
C:资源文件(attrs.xml)添加keycode
注:
1)位置:frameworks\base\core\res\res\values\attrs.xml
 
影响到API则需要调用    make update-api    然后就可以使用了。
 
三、问题debug
按键映射出错或 unknown,排查步骤如下:

  •     用 getevent 确认驱动是否报按键值,是否正确
  •     看kl文件名是否正确?【参见1.2.A】
  •     看kl文件是否正确加载,dumpsys  input 查看KeyLayoutFile是否正确
  •     看native定义的key code是否与key label 在KEYCODES[]数组的位置对应
  •     看java层key code定义是否与native定义一致
 
dumpsys  input 看 KeyLayoutFile如下:
                2:abcxxxx
          Classes: 0x00000001
          Path: /dev/input/event7
          Descriptor: 0ea3e722ddb6fa78cd53a54fc262828fb3df6ca7
          Location: ALSA
          ControllerNumber: 0
          UniqueId:
          Identifier: bus=0x0000, vendor=0x0000, product=0x0000, version=0x0000
          KeyLayoutFile: /system/usr/keylayout/abcxxxx.kl
          KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
          ConfigurationFile:
          HaveKeyboardLayoutOverlay: false
 
         
【Android增加(键盘)按键】 

    推荐阅读