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字符】
注:
1)kl文件须与键盘输入的input 的devic 的名称一致,否则EventHub在加载设备时因找不到对应的kl 而加载默认的qwert.kl,导致键值转换错误
2)kl中的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 增加(键盘)按键的更多相关文章
- Atitit.android js 的键盘按键检测Back键Home键和Menu键事件
Atitit.android js 的键盘按键检测Back键Home键和Menu键事件 1. onKeyDown @Override public boolean onKeyDown(int keyC ...
- Android App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...
- Android App监听软键盘按键的三种方式(转)
最近有类似需求,在csdn上刚好发现,粘贴过来,以防止忘记喽 前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“G ...
- Android 监听软键盘按键的三种方式
前言: 我们在Android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“Go”按键加载url页面:在点击搜索框的时候,点击右下角的searc ...
- 键盘-App监听软键盘按键的三种方式
前言: 我们在android手机上面有时候会遇到监听手机软键盘按键的时候,例如:我们在浏览器输入url完毕后可以点击软键盘右下角的“GO”按键加载url页面:在点击搜索框的时候,点击右下角的sea ...
- Android隐藏虚拟按键,关闭开机动画、开机声音
/*********************************************************************** * Android隐藏虚拟按键,关闭开机动画.开机声音 ...
- Android软键盘事件imeOptions响应
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在android发开过程中,有时候需要对EditText的软键盘进行监听. 当点击软键盘回车位置按键的时候,需要实现 完成.前进.下 ...
- linux系统下键盘按键的重新映射——xmodmap工具和xev工具
大家会不会有时候,感觉键盘上的某几个键用起来不是很方便,打字打久了很容易手指头疼呢? 例如大家使用vim编辑器时, 经常需要使用到esc键,而该键在左上角,很不方便的.再比如写程序的时候,经常会使用到 ...
- Android手机输入法按键监听-dispatchKeyEvent
近期在项目开发中遇到一个关于手机输入键盘的坑.特来记录下. 应用场景: 项目中有一个界面是用viewpaper加三个fragment写的,当中viewpaper被我屏蔽了左右滑动,上面有三个点击按钮, ...
随机推荐
- C++编程练习(2)----“实现简单的线性表的链式存储结构“
单链表采用链式存储结构,用一组任意的存储单元存放线性表的元素. 对于查找操作,单链表的时间复杂度为O(n). 对于插入和删除操作,单链表在确定位置后,插入和删除时间仅为O(1). 单链表不需要分配存储 ...
- TFS 测试用例导入、导出工具
TFS的测试管理提供了测试规划.创建.运行以及进度跟踪等功能.测试人员通过浏览器就几乎可以完成手个测试的全部过程. 用过TFS测试用例的朋友们,很多人应该都知道,在TFS的Portal中以及相应的数据 ...
- appium python andiroid自动化文档整理笔记。
利用一天时间去整理appium for android文档.传送门 利用业余时间自己翻阅资料,google.百度等去查找,费劲一番功夫,最后终于成行了这篇文档. 也是作者对最近自己的学习的一个总结吧, ...
- 理解javascript this 的绑定过程
在理解this 的绑定过程之前,首先要理解调用位置:调用位置就是函数在代码中被调用的位置(而不是声明的位置).只有仔细分析调用位置才能回答这个问题:这个this 到底引用的是什么?通常来说,寻找调用位 ...
- 11 Python+selenium对下拉框(select)进行处理
[环境信息] Python3.4+IE+windows2008 [Select下拉框处理] 1.对于如图1的下拉框,可以用selenium自带的Select类进行选择. 2.定位示例: from se ...
- 基于ES6模块标准通过webpack打包HTM5项目
本篇主要演示通过webpack打包phaser项目,webpack安装方法在此处就不一一赘述了 经常用phaser来写html5游戏的朋友可能会发现,当游戏场景比较多时,如果都写在一个js文件中那么将 ...
- 新学到的xss姿势,分享一下
在js中有一种神奇的对象叫做window 当页面中包含如类似的 <script>var c = urlQuery("callback"); var r = JSON.p ...
- C语言的基本概念
1.经典入门:hello world #include <stdio.h> int main(void) { printf("hello world.\n"); ; } ...
- 什么是Git?
其实我在写这篇随笔的时候连Git是什么都不知道,只是听说过,也注册了一个GitHub的账号,但并不会玩. 我也是查看了半天的网页才明白一个大概,但我觉得以后肯定会经常用到它. 简单的来说, Git 是 ...
- 了解 : http请求过程
游览器的请求就是http 请求,在javascript里可以调用.在发http请求时需要 1.header : 通常表明这是什么报头,如:图片是没有报头的.如果是ajax,会是json 2.body ...