Android按键事件——上层与驱动的映射
http://blog.csdn.net/zengdaquan007/article/details/8686431
首先查看android对上层按键事件的定义,在头文件<KeycodeLabels.h>中:
- static const KeycodeLabel KEYCODES[] = {
- { "SOFT_LEFT", 1 },
- { "SOFT_RIGHT", 2 },
- { "HOME", 3 },
- { "BACK", 4 },
- { "CALL", 5 },
- { "ENDCALL", 6 },
- { "0", 7 },
- { "1", 8 },
- { "2", 9 },
- { "3", 10 },
- { "4", 11 },
- { "5", 12 },
- { "6", 13 },
- { "7", 14 },
- { "8", 15 },
- { "9", 16 },
- { "STAR", 17 },
- { "POUND", 18 },
- { "DPAD_UP", 19 },
- { "DPAD_DOWN", 20 },
- { "DPAD_LEFT", 21 },
- { "DPAD_RIGHT", 22 },
- { "DPAD_CENTER", 23 },
- { "VOLUME_UP", 24 },
- { "VOLUME_DOWN", 25 },
- { "POWER", 26 },
- { "CAMERA", 27 },
- { "CLEAR", 28 },
- { "A", 29 },
- { "B", 30 },
- { "C", 31 },
- { "D", 32 },
- { "E", 33 },
- { "F", 34 },
- { "G", 35 },
- { "H", 36 },
- { "I", 37 },
- { "J", 38 },
- { "K", 39 },
- { "L", 40 },
- { "M", 41 },
- { "N", 42 },
- { "O", 43 },
- { "P", 44 },
- { "Q", 45 },
- { "R", 46 },
- { "S", 47 },
- { "T", 48 },
- ...
- { "BUTTON_14", 201 },
- { "BUTTON_15", 202 },
- { "BUTTON_16", 203 },
- { "LANGUAGE_SWITCH", 204 },
- { "MANNER_MODE", 205 },
- { "3D_MODE", 206 },
- { "CONTACTS", 207 },
- { "CALENDAR", 208 },
- { "MUSIC", 209 },
- { "CALCULATOR", 210 },
- { "ZENKAKU_HANKAKU", 211 },
- { "EISU", 212 },
- { "MUHENKAN", 213 },
- { "HENKAN", 214 },
- { "KATAKANA_HIRAGANA", 215 },
- { "YEN", 216 },
- { "RO", 217 },
- { "KANA", 218 },
- { "ASSIST", 219 },
- // NOTE: If you add a new keycode here you must also add it to several other files.
- // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
- { NULL, 0 }
- };
- </span>
左边是事件的名称,根据字面意思非常容易了解其作用;右边是对应的事件号,比如我们在终端敲入"input keyevent 4"命令,就可以产生BACK的效果。上层按键事件的定义个人建议不要修改,如果增加了一个新的按键事件的定义,也要到KeyEvent.java里面作相应的修改。
按键的底层驱动事件是驱动开发人员自行定义的,这里我们只关心它上报的事件和对应的按键号。假如设备现在有6个按键,其对应的按键事件为:
按键 事件
key 1 0x01
key 2 0x02
key 3 0x03
key 4 0x04
key 5 0x05
key 6 0x06
目前的情况是,android上层已经有按键事件的定义了,底层驱动也有按键事件上报。但是缺少了中间的对接层,也就是说哪个按键对应哪种事件还不清楚。所以,需要为它们加入一个布局文件。按键的布局文件存放在frameworks/base/data/keyboards目录下,以.kl为后缀的文件都是键盘的布局文件,ls一下:
- android-4.2_r1/frameworks/base/data/keyboards$ ls
- Android.mk
- Generic.kcm
- qwerty2.kcm qwerty.kl
- Vendor_046d_Product_c294.kl
- Vendor_054c_Product_0268.kl
- Virtual.kcm
- AVRCP.kl
- Generic.kl
- keyboards.mk
- qwerty.idc
- Vendor_045e_Product_028e.kl
- Vendor_046d_Product_c299.kl
- Vendor_05ac_Product_0239.kl
- common.mk
- qwerty2.idc
- qwerty.kcm
- Vendor_046d_Product_c216.kl
- Vendor_046d_Product_c532.kl
- Vendor_22b8_Product_093d.kl
- </span>
具体读取哪个布局文件是根据驱动的名字来确定的,如果找不到与驱动名字相同的文件,就会读取默认文件Generic.kl。现在我们假设键盘在驱动层的名字为“my_keypad”,所以需要创建一个名为“my_keypad,kl”的布局文件。文件的内容是什么呢,不急。目前还有一点不明确,上面提到的6个按键的作用我们还没有定义。假设定义如下:
按键 作用
key 1 确定
key 2 返回
key 3 菜单
key 4 主解面
key 5 左移
key 6 右移
对应的布局文件“my_keypad,kl”的内容就应该为:
- <span style="font-size:14px;">key 0x1 ENTER
- key 0x2 BACK
- key 0x3 MENU
- key 0x4 HOME
- key 0x5 DPAD_LEFT
- key 0x6 DPAD_RIGHT</span>
把布局文件编译进系统,在当前目录的common.mk中,在keylayouts变量的末尾加入: my_keypad.kl\
到这里,android键盘的底层驱动事件跟上层定义的按键事件就对应起来了。
************************************************************************************************************
我的实际工作经验,增加audio jack 的button的映射关系
1. @device/somc/yukon/AndroidBoard.mk中添加
include $(CLEAR_VARS)
LOCAL_MODULE := msm8226-tapan-snd-card_Button_Jack.kl
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := ETC
LOCAL_SRC_FILES := $(LOCAL_MODULE)
LOCAL_MODULE_PATH := $(TARGET_OUT_KEYLAYOUT)
include $(BUILD_PREBUILT)
则会在手机 system/usr/keylayout 目录下增加文件 msm8226-tapan-snd-card_Button_Jack.kl
2. @device/somc/yukon/platform.mk中增加
PRODUCT_PACKAGES += \
msm8226-tapan-snd-card_Button_Jack.kl
3. @device/somc/yukon目录下增加文件msm8226-tapan-snd-card_Button_Jack.kl
4. 特别注意 msm8226-tapan-snd-card_Button_Jack.kl的文件名不是随意写的。
status_t KeyMap::load@frameworks/base/libs/androidfw/keyboard.cpp
{
if (deviceConfiguration) {
String8 keyLayoutName;
if (deviceConfiguration->tryGetProperty(String8("keyboard.layout"),
....
}
// Try searching by device identifier.
if (probeKeyMap(deviceIdenfifier, String8::empty())) {
return OK;
}
// Fall back on the Generic key map.
// TODO Apply some additional heuristics here to figure out what kind of
// generic key map to use (US English, etc.) for typical external keyboards.
if (probeKeyMap(deviceIdenfifier, String8("Generic"))) {
return OK;
}
// Try the Virtual key map as a last resort.
if (probeKeyMap(deviceIdenfifier, String8("Virtual"))) {
return OK;
}
}
#getevent -i
add device 2: /dev/input/event7
bus: 0000
vendor 0000
product 0000
version 0000
name: "msm8226-tapan-snd-card Button Jack"
location: "ALSA"
id: ""
version: 1.0.1
events:
KEY (0001): 00e2 0101 0102 0103 0104 0105 0106 0107
input props:
<none>
读取*.kl的名字组合顺序为
a. 首先查看 props中是否有keyboard.layout的参数,如果有则读取该名字的kl文件
b. 如果 该设备的vendor,product和version都不全为0,则通过它们的组合成 kl的文件名
Vendor_%04x_Product_%04x_Version_%04x.kl
Vendor_%04x_Product_%04x.kl
最终形成文件路径system/usr/keylayout/Vendor_xxxx_Product_xxxx.kl或system/usr/keylayout/Vendor_xxxx_Product_xxxx_Version_xxxx.kl
c. 如果vendor,product,version都为0,则通过该设备的name: "msm8226-tapan-snd-card Button Jack"来组合kl文件名
appendInputDeviceConfigurationFileRelativePath中会把其中的空格转换成'_'
最终形成文件路径system/usr/keylayout/msm8226-tapan-snd-card_Button_Jack.kl
5.还可以直接用 snd_jack_set_key 映射
ret = snd_jack_set_key(button_jack.jack,SND_JACK_BTN_0,KEY_MEDIA);
*********************************************************************************************************
Android按键事件——上层与驱动的映射相关推荐
- android按键事件响应函数,android 响应按键按下的onKeyDown()函数?
翻过高山走不出你 Activity.onKeyDown();当某个键被按下时会触发,但不会被任何的该Activity内的任何view处理.默认按下KEYCODE_BACK键后会回到上一个Activit ...
- qt Android 按键事件,QT无窗口状态下对键盘事件的监听
Question:最近在搞linux下的一个客户端项目,需要接收键盘事件,但是又不能有界面,这种情况怎么处理呢? int main(int argc, char *argv[]) { QApplica ...
- Android平台开发-Android keypad map-Android按键事件
http://hi.baidu.com/i_know_all/blog/item/0a1dd8ecdde99acb2f2e2159.html 一.Android底层按键事件处理过程 在系统启动后,在文 ...
- Android 4.0按键事件以及系统流程分析
Android 4.0中按键的处理流程 按键在Android系统中,有着不同的代表意义.以前的全键盘的手机代码没有阅读过,所以也不是很了解.本人介绍的是在触摸屏的手机上的按键消息的处理流程. 在现在触 ...
- Android怎样监听蓝牙耳机的按键事件
Android怎样监听蓝牙耳机的按键事件 写在前面: 直接想要代码非常easy,你直接把滚动栏拉到最底端就能够看到.假设想要十分地了解为什么,那就依照我规划的一步一步来理解.下面測试环境以手头上有的「 ...
- Android如何监听蓝牙耳机的按键事件(转)
源: Android如何监听蓝牙耳机的按键事件 写在前面: 直接想要代码很简单,你直接把滚动条拉到最底端就可以看到.如果想要十分地了解为什么,那就按照我规划的一步一步来理解.以下测试环境以手头上有的「 ...
- Android按键字符映射文件
按键字符映射文件(.kcm 文件)负责将 Android 按键代码与修饰符的组合映射到Unicode字符. 如果只是告诉系统该设备仅用于特殊用途(非全键盘),那么对于具有按键的所有内部(内置)输入设备 ...
- Android开发--事件的处理/按键按下,弹起,触摸事件等
android中的事件类型分为按键事件和屏幕触摸事件 事件是我们在于UI交互式发生的,我们点击一个按键时,可能就已经除非好几个事件,例如我们点击数字键"0",他会涉及到按下事件,和 ...
- android 锁屏音量,Android锁屏状态获取音量按键事件
Android系统没有提供音量按键的广播,而Activity的onKeyDown方法只有在界面显示时才能捕获音量变化, 要在锁屏状态或后台获得音量按键事件,可以通过判断音量值的改变来判断是否按下了音量 ...
最新文章
- CCF201803-1 跳一跳(序列处理)
- QString与std::string的相互转换
- Eclipse遇到的错误
- Linux虚拟机安装配置准备工作之--- VMware ( Bridge )
- Stopwatch类学习
- PowerDesigner运行自定义VBS脚本,复制Name到Comment
- readline库实现命令行自动补全
- 去掉java文件中的注释_利用JavaParser去除java文件中的注释
- linux 卷文件满,LVM逻辑卷容量的增减
- 谨慎选择镭射祛斑,极易反黑!一定要做好防晒,否则会变成永无止尽的黑斑地狱!
- Idea社区版部署项目到tomcat
- 即时通讯开发移动端弱网络优化方法总结
- 螃蟹WiFi驱动中的Band Steering功能
- python print输出指定小数位数
- NatureProtocols:使用MicrobiomeAnalyst统计和功能分析微生物组数据
- hp8080计算机无法usb启动,HP Compaq 8000 Elite 台式机​无法从U盘启动解决办法
- IBUFDS、IBUFGDS和OBUFDS
- ajax 实现关键字搜索,jQuery实现搜索页面关键字的功能
- 微信小程序获取附近商家
- docker安装及设置镜像源-zls
热门文章
- 团结波士顿更新:Rob Pardo,完整会议日程安排,并通过Unity展示柜制作!
- Dev C++快捷操作指令
- mysql pmt函数怎么用_制作C/C++动态链接库(dll)若干注意事项
- 学长带路学吉他,这几招足够了
- 数据挖掘实战—餐饮行业的数据挖掘之数据探索(EDA)
- [趣味定理]喝醉的酒鬼总能找到回家的路,喝醉的小鸟则可能永远也回不了家。
- 【JS缓存技术】-本地存储
- 电气化铁路变电站自动化安全监控传输方案
- 【华为OD机试 2022】 冠亚军排名,奖牌榜排名(C++ Java JavaScript Python)
- idea ubuntu 与 快捷键冲突_解除Intellij Idea中的热键冲突