休言女子非英物,夜夜龙泉壁上鸣。这篇文章主要讲述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增加(键盘)按键】
推荐阅读
- Android 6.0权限申请
- Android帧动画实现,防OOM,比原生动画集节约超过十倍的资源
- GRE数据分析|数据分布,随机变量和概率分布
- Java程序打印字符串的不同排列
- Oracle面试经验|S62(校园服务器技术)
- Java使用正则表达式验证日期格式
- 按字典顺序,给定字符串的所有最短回文子字符串
- 打印数组A[]中的所有字符串,并将数组B[]中的所有字符串作为子序列
- CRASH()宏–用法解释