Android按键事件——上层与驱动的映射
【Android按键事件——上层与驱动的映射】原创:M_r_D
转载请注明出处!
首先查看android对上层按键事件的定义,在头文件
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 }
};
左边是事件的名称,根据字面意思非常容易了解其作用;右边是对应的事件号,比如我们在终端敲入"input keyevent 4"命令,就可以产生BACK的效果。上层按键事件的定义个人建议不要修改,如果增加了一个新的按键事件的定义,也要到KeyEvent.java里面作相应的修改。 按键的底层驱动事件是驱动开发人员自行定义的,这里我们只关心它上报的事件和对应的按键号。假如设备现在有6个按键,其对应的按键事件为:
按键事件
key 10x01
key 20x02
key 30x03
key 40x04
key 50x05
key 60x06
目前的情况是,android上层已经有按键事件的定义了,底层驱动也有按键事件上报。但是缺少了中间的对接层,也就是说哪个按键对应哪种事件还不清楚。所以,需要为它们加入一个布局文件。按键的布局文件存放在frameworks/base/data/keyboards目录下,以.kl为后缀的文件都是键盘的布局文件,ls一下:
android-4.2_r1/frameworks/base/data/keyboards$ ls
Android.mk
Generic.kcm
qwerty2.kcmqwerty.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
具体读取哪个布局文件是根据驱动的名字来确定的,如果找不到与驱动名字相同的文件,就会读取默认文件Generic.kl。现在我们假设键盘在驱动层的名字为“my_keypad”,所以需要创建一个名为“my_keypad,kl”的布局文件。文件的内容是什么呢,不急。目前还有一点不明确,上面提到的6个按键的作用我们还没有定义。假设定义如下:
按键作用
key 1确定
key 2返回
key 3菜单
key 4主解面
key 5左移
key 6右移
对应的布局文件“my_keypad,kl”的内容就应该为:
key 0x1ENTER
key 0x2BACK
key 0x3MENU
key 0x4HOME
key 0x5DPAD_LEFT
key 0x6DPAD_RIGHT
把布局文件编译进系统,在当前目录的common.mk中,在keylayouts变量的末尾加入: my_keypad.kl\
到这里,android键盘的底层驱动事件跟上层定义的按键事件就对应起来了。
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 事件代理
- 带有Hilt的Android上的依赖注入
- 事件处理程序
- android|android studio中ndk的使用
- 「按键精灵安卓版」关于全分辨率脚本的一些理解(非游戏app)
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库