以添加 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中的键值。

Bkl文件添加到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),否则会映射错误

BJAVA 定义(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 增加(键盘)按键的更多相关文章

  1. Atitit.android js 的键盘按键检测Back键Home键和Menu键事件

    Atitit.android js 的键盘按键检测Back键Home键和Menu键事件 1. onKeyDown @Override public boolean onKeyDown(int keyC ...

  2. Android App监听软键盘按键的三种方式

    前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...

  3. Android App监听软键盘按键的三种方式(转)

    最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“G ...

  4. Android 监听软键盘按键的三种方式

    前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面:在点击搜索框的时候,点击右下角的searc ...

  5. 键盘-App监听软键盘按键的三种方式

    前言:   我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...

  6. Android隐藏虚拟按键,关闭开机动画、开机声音

    /*********************************************************************** * Android隐藏虚拟按键,关闭开机动画.开机声音 ...

  7. Android软键盘事件imeOptions响应

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在android发开过程中,有时候需要对EditText的软键盘进行监听. 当点击软键盘回车位置按键的时候,需要实现 完成.前进.下 ...

  8. linux系统下键盘按键的重新映射——xmodmap工具和xev工具

    大家会不会有时候,感觉键盘上的某几个键用起来不是很方便,打字打久了很容易手指头疼呢? 例如大家使用vim编辑器时, 经常需要使用到esc键,而该键在左上角,很不方便的.再比如写程序的时候,经常会使用到 ...

  9. Android手机输入法按键监听-dispatchKeyEvent

    近期在项目开发中遇到一个关于手机输入键盘的坑.特来记录下. 应用场景: 项目中有一个界面是用viewpaper加三个fragment写的,当中viewpaper被我屏蔽了左右滑动,上面有三个点击按钮, ...

随机推荐

  1. removeAll

    问题:无法移除2个集合中相同元素 方法:移除所包含的其所有元素. 在执行removeAll方法时,会先对集合元素进行比较,如果元素相等才执行移除操作,说到这,相信很多人都已经明白是怎么回事了,因为不相 ...

  2. ion-scroll zooming="true" android端无法缩放的问题

    很久很久没更新博客了,从今天开始决定以后陆续写一些博文,总结下自己在开发中碰到的问题. ionic项目.ion-scroll zooming="true" 在android端无法缩 ...

  3. Sass与Compass——回顾

    compass 是sass的一个工具库 compass在sass 的基础上封装了一系列有用的模块,用来补充和丰富sass的工能, 安装: compass是用 ruby语言开发的,所以安装它之前必须安装 ...

  4. python中文编码问题深入分析(一):字符编码基础

    背景:笔者作为一名刚接触python语言的新手,在实际的项目中,遇到过一些中文编码问题,初次遇到这些问题的时候,刚开始显得有些手足无措,也不知从何查起.常言道:有问题,找度娘!当我打开www.baid ...

  5. DHCP协议

    来源摘取自百度百科 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服 ...

  6. PAT乙级 1065. 单身狗(25) by Python

    1065. 单身狗(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue "单身狗"是中文对 ...

  7. [Netty] - Netty IN ACTION(导言)

    最近没什么事儿做,刚好看到有需要网络编程的知识,java中有NIO和IO两种不同的方式,但是NIO的编写比较麻烦,刚好找到一个成熟的网络框架Netty.接下来的一个月就准备将Netty IN ACTI ...

  8. 如何用Visual Studio 2008 写汇编程序?

    如何用Visual Studio 2008写汇编程序? 最近在上夏季小学期,在学汇编语言,关于用什么编辑环境一直很纠结.很想找到一个比较好的IDE,但是试了几个像RadASM之类的,发现还不是很满意. ...

  9. 第一章 Java语言概述2

    一.编写第一个Java应用程序 1.下载.安装JDK 官方网址:www.oracle.com java.sun.com 安装JDK 傻瓜式安装,下一步即可. 建议:安装路径不要有中文或者特殊符号,如空 ...

  10. 【转】Netty系列之Netty是什么

    Netty是什么 大概用Netty的,无论新手还是老手,都知道它是一个“网络通讯框架”.所谓框架,基本上都是一个作用:基于底层API,提供更便捷的编程模型.那么”通讯框架”到底做了什么事情呢?回答这个 ...