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

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

时间: 2024-11-10 01:10:49

Android 增加(键盘)按键的相关文章

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

最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中

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

前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的"GO"按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE

通过注册表修改键盘按键的映射

Scancode Map的妙用,按键随意变换! 在Windows XP/Windows 2000 系统中,提供了一种新的键盘扫描码映射方法,使你能随意地设置键盘键位的布局,这就是注册表中的 “Scancode Map”我们巧妙利用“Scancode Map”就可将普通键盘改造成随心随意的个性化键盘. 为了正确设置,我们有必要先了解一下“Scancode Map”(扫描码映射). “Scancode Map”是注册表中[HKEY_LOCAL_MacHINE\SYSTEM\CurrentContro

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

前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的search符号键可以进行搜索:或者在全部数据输入完毕后,点击右下角的"done"就马上进行下一步操作. 效果图: function 1: 重写Activity的dispatchKeyEvent(KeyEvent event)方法,在其中监听KeyEventKey.KEYCODE_ENTER键(右下

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

近期在项目开发中遇到一个关于手机输入键盘的坑.特来记录下. 应用场景: 项目中有一个界面是用viewpaper加三个fragment写的,当中viewpaper被我屏蔽了左右滑动,上面有三个点击按钮,点击他们能够切换页面(不要问我为什么这么写,由于你不知道需求有多么的操蛋).每一个fragment里面都有五六个竖着排列的edittext.仅仅有一个fragment里面的edittext都填写了才让跳到下一个.大致效果图例如以下: 遇到的问题 測试的时候发现一个问题(说实话确实非常佩服这个測试妹子

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

/*********************************************************************** * Android隐藏虚拟按键,关闭开机动画.开机声音 * 声明: * 有时候,我们可能会希望隐藏掉android中的虚拟按键,当然,那个 * Android的开机动画,有时候也是挺讨人厌的,也是可以隐藏的. * * 2016-1-7 深圳 南山平山村 曾剑锋 **********************************************

【转载】android软键盘的一些控制

原文地址:http://blog.csdn.net/wang_shaner/article/details/8467688 "EditText + Button"  形成一个 "输入+按键响应" 的案例在android编程中是最常见不过的了. 但还有一些细节需要注意: 在EditText输入后,点击Button进行请求,软键盘应该自行消失 在EditText输入后,不点击Button进行请求,而是直接点击软键盘上的"回车",那么也应该能够正常响应

13.Linux键盘按键驱动 (详解)

版权声明:本文为博主原创文章,未经博主允许不得转载. 在上一节分析输入子系统内的intput_handler软件处理部分后,接下来我们开始写input_dev驱动 本节目标: 实现键盘驱动,让开发板的4个按键代表键盘中的L.S.空格键.回车键 1.先来介绍以下几个结构体使用和函数,下面代码中会用到 1)input_dev驱动设备结构体中常用成员如下: struct input_dev { void *private; const char *name; //设备名字 const char *ph

C语言获取键盘按键

在写控制台游戏的时候,发现不管用cin,scanf还是getchar,都不能实时的输入按键,必须要按回车才能读进去,而按回车的话会导致输入异常,所以要使用获取键盘按键的函数. 加入头文件#include<conio.h>,函数为getch(),返回的是int类型,可以把键盘上的键都按一遍,来尝试每个键对应的值是什么. 其中关键的键位如下: w:119 a:97 s:115 d:100 ↑:72 ↓:80 ←:75 →:77