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被我屏蔽了左右滑动,上面有三个点击按钮, ...
随机推荐
- LoadRunner 调用Dll完成加密解密
LoadRunner里的函数比较少,没有MD5.Base64加密. 我们可以通过在C++里把一些加解密写成函数,供LR调用. DLL函数编写 C++里新建工程Class Library(此处是用VS2 ...
- java_监控工具jvisualvm
转:使用 VisualVM 进行性能分析及调优 启动:jvisualvm 首先到JDK安装目录/bin目录下,双击jvisualvm.exe文件启动 需要注意的是:当OS所在分区是FAT格式时,Vis ...
- 【Java】Objects 源码学习
2017-02-10 by 安静的下雪天 http://www.cnblogs.com/quiet-snowy-day/p/6387321.html 本篇概要 Objects 与 Object ...
- MongoDB学习总结(二) —— 基本操作命令(增删改查)
上一篇介绍了MongoDB在Windows平台下的安装,这一篇介绍一下MongoDB的一些基本操作命令. 下面我们直奔主题,用简单的实例依次介绍一下. > 查看所有数据库 (show dbs) ...
- 如何让 Git 忽略掉文件中的特定行内容?
近期在git遇到几个问题,让我重新认识到git的强大性,下面列出来记录一下 有一个数据库的配置文件,在用 git add 添加到 index file 时不能透露了相关配置.而如果用 .gitigno ...
- start(共勉)
“父母在,不远游,游必有方.”正犹豫着或者已经在路上的年轻人,如果选择远行,请风雨兼程,好好奋斗吧.
- TJOI2015 day1解题报告
博客园的编辑器真的是太蛋疼了= =,想用tex然后上jpg又贴不了链接,真的很纠结啊= = T1:[TJOI2015]线性代数 描述:戳上面吧= = 首先这道题我觉得是这套题最漂亮的一道题了(虽然说学 ...
- java中final小结
fanal 修饰类,该变量一经赋值,就不能够再修改 修饰类,该类不能让子类继承. 修饰方法,该方法不能被子类重写(隐藏). fanal修饰类与方法的意义 1 某个类或方法实现上已经非常完善,不需要子 ...
- python2.7读汉字的时候出现乱码,如何解决
我使用的是window系统,安装Anaconda,所以用的是. 1.数据形式 2.读进来乱码 3.解决办法 3.1方法1 import pandas as pd #pd.read_csv('c:/us ...
- xcode升级到8.1
一.JPush集成: 1. xcode7在iOS10以上的真机上运行接收不到通知的问题,把xcode升级到8.1,在build phases -> link binary with librar ...