1.Android使用标准的linux输入事件设备(/dev/input目录下)和驱动,按键定义在内核include/linux/input.h文件中, 按键定义形式如下: #define KEY_ESC 1
2.内核中在board文件中定义按钮gpio_keys_button时需要指定该按钮的code值,如: static struct gpio_keys_button gpio_buttons[] = { { .code = KEY_ESC, .gpio = 18, .desc = "user", .wakeup = 1, }, };
3.上面实现了从硬件GPIO口到内核标准按键的映射,但是android并没有直接使用映射后的键值,而且对其再进行了一次映射,从内核标准键值到android所用键值的映射表定义在android文件系统的/system/usr/keylayout目录下。标准的映射文件为qwerty.kl,定义如下: key 1 new
4.如果需要增加按键,则需要在frameworks/base/include/ui/KeycodeLabels.h在数组keycodes 中添加 新定义的信息,如: { "new" , 150 }
frameworks/base/core/res/res/values/attrs.xml中增加: <enum name="KEYCODE_new" value="150"/>
frameworks/base/core/java/android/view/KeyEvent.java中增加: public static final int KEYCODE_new = 150;
以上的更改,新的键值就添加上去了,由于更改了 KeyEvent,影响到了API,所以需要make update-api
5.frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java负责处理按键事件。例如需要增加一个按键触发静音模式,则修改其interceptKeyBeforeQueueing()代码,增加: if (keyCode == KeyEvent.KEYCODE_new) { final IAudioService audio = getAudioInterface(); if (audio == null) { return; } try { audio.setRingerMode(AudioManager.RINGER_MODE_SILENT); } catch(Exception ex) { } }
|