开发过程中免不得需要增加或减少按键码值,在android2.3系统事件处理部分,主要向上层提供统一的按键码(KeyCode),这个按键码是一个整数,在上层的Java程序中主要通过这个值来判断系统的实现。

关于输入事件的处理前面已经讲过,请参考:http://blog.csdn.net/andyhuabing/article/details/7006688

这里主要讲Android事件的处理过程,需要经过两个转换步骤: 

1、键扫描码ScanCode是由Linux的Input驱动框架定义的整数类型,可参考input.h头文件

在步骤一中将其值转换成表示按键的字符串

键盘布局文件(*.kl)将完成第一步的转换,放在/system/usr/keylayout/下面

举例如下:

input.h 中字母键定义:

#define KEY_Q 16
#define KEY_W 17
#define KEY_E 18
#define KEY_R 19
#define KEY_T 20
#define KEY_Y 21
#define KEY_U 22
#define KEY_I 23
#define KEY_O 24
#define KEY_P 25

而qwert.kl中定义如下:

ScanCode + 字符串值

key 16    Q
key 17    W
key 18    E
key 19    R
key 20    T
key 21    Y
key 22    U
key 23    I
key 24    O
key 25    P

2、通过查找KEYCODES数组,将literal字符串转换成value的整型值,即转换到KeyCode值了

片段如下,右边的值是android系统中使用的KeyCode值:(文件路径:frameworks/base/include/ui/KeycodeLabels.h)

static const KeycodeLabel KEYCODES[] = {

...

{ "A", 29 },
    { "B", 30 },
    { "C", 31 },
    { "D", 32 },
    { "E", 33 },
    { "F", 34 },
    { "G", 35 },
    { "H", 36 },
    { "I", 37 },
    { "J", 38 },
    { "K", 39 },
    { "L", 40 },
    { "M", 41 },
    { "N", 42 },
    { "O", 43 },
    { "P", 44 },
    { "Q", 45 },
    { "R", 46 },
    { "S", 47 },
    { "T", 48 },
    { "U", 49 },
    { "V", 50 },
    { "W", 51 },
    { "X", 52 },
    { "Y", 53 },
    { "Z", 54 },

...

};

右边的值在android中定义如下:(文件路径:frameworks/base/include/android/keycodes.h)

/*
 * Key codes.
 */
enum {

AKEYCODE_A               = 29,
    AKEYCODE_B               = 30,
    AKEYCODE_C               = 31,
    AKEYCODE_D               = 32,
    AKEYCODE_E               = 33,
    AKEYCODE_F               = 34,
    AKEYCODE_G               = 35,
    AKEYCODE_H               = 36,
    AKEYCODE_I               = 37,
    AKEYCODE_J               = 38,
    AKEYCODE_K               = 39,
    AKEYCODE_L               = 40,
    AKEYCODE_M               = 41,
    AKEYCODE_N               = 42,
    AKEYCODE_O               = 43,
    AKEYCODE_P               = 44,
    AKEYCODE_Q               = 45,
    AKEYCODE_R               = 46,
    AKEYCODE_S               = 47,
    AKEYCODE_T               = 48,
    AKEYCODE_U               = 49,
    AKEYCODE_V               = 50,
    AKEYCODE_W               = 51,
    AKEYCODE_X               = 52,
    AKEYCODE_Y               = 53,
    AKEYCODE_Z               = 54,

..

};

这里的键值与KeyEvent.java中的值是对应的:(文件路径:frameworks/base/core/java/android/view/KeyEvent.java)

/** Key code constant: 'A' key. */
    public static final int KEYCODE_A               = 29;
    /** Key code constant: 'B' key. */
    public static final int KEYCODE_B               = 30;
    /** Key code constant: 'C' key. */
    public static final int KEYCODE_C               = 31;
    /** Key code constant: 'D' key. */
    public static final int KEYCODE_D               = 32;
    /** Key code constant: 'E' key. */
    public static final int KEYCODE_E               = 33;
    /** Key code constant: 'F' key. */
    public static final int KEYCODE_F               = 34;
    /** Key code constant: 'G' key. */
    public static final int KEYCODE_G               = 35;
    /** Key code constant: 'H' key. */
    public static final int KEYCODE_H               = 36;
    /** Key code constant: 'I' key. */
    public static final int KEYCODE_I               = 37;
    /** Key code constant: 'J' key. */
    public static final int KEYCODE_J               = 38;
    /** Key code constant: 'K' key. */
    public static final int KEYCODE_K               = 39;
    /** Key code constant: 'L' key. */
    public static final int KEYCODE_L               = 40;
    /** Key code constant: 'M' key. */
    public static final int KEYCODE_M               = 41;
    /** Key code constant: 'N' key. */
    public static final int KEYCODE_N               = 42;
    /** Key code constant: 'O' key. */
    public static final int KEYCODE_O               = 43;
    /** Key code constant: 'P' key. */
    public static final int KEYCODE_P               = 44;
    /** Key code constant: 'Q' key. */
    public static final int KEYCODE_Q               = 45;
    /** Key code constant: 'R' key. */
    public static final int KEYCODE_R               = 46;
    /** Key code constant: 'S' key. */
    public static final int KEYCODE_S               = 47;
    /** Key code constant: 'T' key. */
    public static final int KEYCODE_T               = 48;
    /** Key code constant: 'U' key. */
    public static final int KEYCODE_U               = 49;
    /** Key code constant: 'V' key. */
    public static final int KEYCODE_V               = 50;
    /** Key code constant: 'W' key. */
    public static final int KEYCODE_W               = 51;
    /** Key code constant: 'X' key. */
    public static final int KEYCODE_X               = 52;
    /** Key code constant: 'Y' key. */
    public static final int KEYCODE_Y               = 53;
    /** Key code constant: 'Z' key. */
    public static final int KEYCODE_Z               = 54;

...

如果改动了这里,影响到API则需要调用make update-api

ok,理清楚了以上的转换关系,下面就说一下如何增加按键,以增加gamekey为例:

1 、键盘布局文件中增加键,一般是qwery.kl (一定是以*.kl结尾的文件):

key 304 BUTTON_A

key 305 BUTTON_B

key 306 BUTTON_C

key 307 BUTTON_X

key 308 BUTTON_Y

key 309 BUTTON_Z

key 315 BUTTON_START

key 316 BUTTON_MODE

2、在frameworks/base/include/ui/KeycodeLabels.h中增加KeycodeLabel类型的Code数组

{ "BUTTON_A", 96 },
    { "BUTTON_B", 97 },
    { "BUTTON_C", 98 },
    { "BUTTON_X", 99 },
    { "BUTTON_Y", 100 },
    { "BUTTON_Z", 101 },

{ "BUTTON_START", 108 },

{ "BUTTON_MODE", 110 },

目前的2.3系统已经添加

3、在frameworks/base/include/android/keycodes.h中增加KeyCode的枚举值

AKEYCODE_BUTTON_A        = 96,
    AKEYCODE_BUTTON_B        = 97,
    AKEYCODE_BUTTON_C        = 98,
    AKEYCODE_BUTTON_X        = 99,
    AKEYCODE_BUTTON_Y        = 100,
    AKEYCODE_BUTTON_Z        = 101,

AKEYCODE_BUTTON_START    = 108,
    AKEYCODE_BUTTON_MODE     = 110,

目前的2.3系统已经添加

4、JAVA层的keyEvent.java中增加用于java应用程序使用

略,目前的2.3系统已经添加

5、在frameworks\base\core\res\res\values\attrs.xml中增加表示属性的资源文件,添加相应用name="keycode"的attr

<enum name="KEYCODE_BUTTON_A" value="96" />

<enum name="KEYCODE_BUTTON_B" value="97" />

<enum name="KEYCODE_BUTTON_C" value="98" />

<enum name="KEYCODE_BUTTON_X" value="99" />

<enum name="KEYCODE_BUTTON_Y" value="100" />

<enum name="KEYCODE_BUTTON_Z" value="101" />

<enum name="KEYCODE_BUTTON_START" value="108" />

<enum name="KEYCODE_BUTTON_MODE" value="110" />

ok,完成以上步骤应该就可以使用了。

查找key是否有没有被过滤掉重点确认的地方:

1、EventHub.cpp 文件中的getEvent函数

if (iev.type == EV_KEY) {
               status_t err = device->layoutMap->map(iev.code,
                         & outEvent->keyCode, & outEvent->flags);
               LOGV("iev.code=%d keyCode=%d flags=0x%08x err=%d\n",
                          iev.code, outEvent->keyCode, outEvent->flags, err);
               if (err != 0) {
                      outEvent->keyCode = AKEYCODE_UNKNOWN;
                       outEvent->flags = 0;
               }

}

确认这里转换是否ok了,如果没有则可能*.kl文件中没有添加进去这个键值

2、InputReader.cpp文件中的KeyboardInputMapper处理函数process

void KeyboardInputMapper::process(const RawEvent* rawEvent) {
    switch (rawEvent->type) {
    case EV_KEY: {
        int32_t scanCode = rawEvent->scanCode;
        if (isKeyboardOrGamepadKey(scanCode)) {
            processKey(rawEvent->when, rawEvent->value != 0, rawEvent->keyCode, scanCode,
                    rawEvent->flags);
        }
        break;
    }
    }
}

bool KeyboardInputMapper::isKeyboardOrGamepadKey(int32_t scanCode) {
    return scanCode < BTN_MOUSE
        || scanCode >= KEY_OK
        || (scanCode >= BTN_GAMEPAD && scanCode < BTN_DIGI);
}

可以在processKey中加打印,确认已通过notifyKey上报键值给android系统了。

附加,如何编译生成qwerty.kcm.bin 文件:

android为了减少载入时间,并没有使用原始按键表文件,而是将其转换成二进制文件
转换的工具源代码在android源代码build/tools/kcm目录下,android在编译过程中会
首先编译转换工具,然后利用转换工具将qwerty.kcm文件转换成qwerty.kcm.bin

转换后的二进制文件复制到out/target/product/<board_name>/system/usr/keychars
目录下,也就是目标平台的/system/usr/keychars目录中。

用法:

static int usage()
{
    fprintf(stderr,
            "usage: kcm INPUT OUTPUT\n"
            "\n"
            "INPUT   keycharmap file\n"
            "OUTPUT  compiled keycharmap file\n"
        );
    return 1;
}

android键盘输出增加按键码相关推荐

  1. Android底层和中间层共同学习系列之android键盘映射

     http://blog.csdn.net/hongjiujing/article/details/5016730 Android底层和中间层共同学习系列之android键盘映射         ...

  2. 自定义Android键盘

    前言 相关属性 Keyboard Row Key KeyboardView 自定义键盘 布局 字母键盘布局 数字键盘布局 逻辑 回显 备选小键盘 前言 前段时间改造了公司的安全键盘,是基于Dialog ...

  3. android缅甸语,Android键盘输入语言设置默认打开myanmar缅甸语的步骤

    不管你在学什么语言,当你觉得自己不擅长的时候,突然听到你的老师或其他人用你认为自己不擅长的语言流畅地交谈,你会感到热血沸腾,下面我们就跟着爱站技术频道小编一起来了解键盘输入语言设置默认打开myanma ...

  4. Android 键盘键名和键值列表

    转载自:https://blog.csdn.net/mazhidong/article/details/79567306 Android 键盘键名和键值列表 小小小程序元 2018-03-15 14: ...

  5. Android键盘切换闪动原理及解决方案

    Android键盘切换闪动原理及解决方案 主要内容 键盘切换闪动原理 键盘切换闪动解决方案 设置键盘softInputMode使用adjustPan,增加一个与键盘同高的支撑视图(不推荐) 设置键盘s ...

  6. ACMNO.25 C语言-间隔输出 写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格。如输入1990,应输出1 9 9 0。 输入 一个四位数 输出 增加空格输出

    题目描述 写一函数,输入一个四位数字,要求输出这四个数字字符,但每两个数字间空格.如输入1990,应输出"1 9 9 0". 输入 一个四位数 输出 增加空格输出 样例输入 199 ...

  7. android 上键,在Android键盘上设置Return键

    有没有人友好的编码器知道如何更改Android键盘的返回键上的文本.我正在捕获EditText元素的return事件以启动操​​作.所以我想向用户显示他可以用该键启动操作.一些应用程序这样做.例如.他 ...

  8. js 里面的键盘事件对应的键码

    js 里面的键盘事件对应的键码 js 里面的键盘事件经常用到,所以收集了键盘事件对应的键码来分享下: keyCode 8 = BackSpace BackSpace keyCode 9 = Tab T ...

  9. android 键盘点击事件监听事件,Android 键盘事件触发以及监听

    一.Android 手动显示和隐藏软键盘 如果输入法在窗口上已经显示,则隐藏,反之则显示 InputMethodManager imm = (InputMethodManager) getSystem ...

最新文章

  1. java新特性对数组的支持
  2. 决策树模型回归可视化分析_【时间序列分析】在论文中用向量自回归(VAR)模型时应注意哪些问题?...
  3. 单片机成长之路(51基础篇) - 022 N76e003 APROM模拟EEPROM驱动
  4. C++ volatile关键字说明
  5. python3调用c语言数组,使用Python中的ctypes访问数组
  6. 什么是透明传输 点对多传输? 它们有哪些经典应用和优势特点
  7. controller调用另一个controller中的方法 获取返回值_必须掌握!你知道 Spring 中运用的 9 种设计模式吗 ?...
  8. 批处理ping指定ip列表
  9. horizon服务主要模块_openstack七大模块概述
  10. Windows 8实用窍门系列:1.使用Xaml+C#开发第一个Metro Style应用程序
  11. C++开发坦克大战--补充(加入传送门)--附完整代码
  12. win7下安装最新版nodejs16.4.0
  13. 2022年湖南省自考考试学前教育幼儿文学练习题及答案
  14. 公式图片转latex神器Mathpix以及latex公式与word公式的相互转换
  15. mysql table plugin_MySQL 启动报错Table 'mysql.plugin' doesn't exis(转载)
  16. FPGA自学笔记(二)仿真文件tb
  17. 异常 exception
  18. 数字电子技术基础实验 实验一 门电路的逻辑功能及参数测试(含数据及思考题)
  19. notepad++配置java,c,c++,python,shell运行环境
  20. MACos下面brew install 速度慢

热门文章

  1. JDK6和JDK7中的substring()方法
  2. 《计算机网络思想》系列(1)网络体系结构———理解,总结,辨析,升华
  3. 存储过程传递参数时出现类型转换错误!如:varchar转换为int时出错
  4. loadrunner脚本中关于httpCode401特殊情况
  5. Android XML文件读写
  6. Android事件传递机制【Touch事件】
  7. IDEF企业软件系统建模方法
  8. 最棒的 JavaScript 学习指南
  9. Gabor滤波简介与Opencv中的实现及参数变化实验
  10. java 数组协变_java 数组协变