网上存在一些关于Android系统添加自定义按键的文章,但大多针对Android2.3和4.0系统的,许多文件都已经变动位置了,这两天我总结了一些,写出来欢迎大家交流与指正:
文件,当然如果定义板级键值文件,还是以rk29-keypad.kl文件优先。
1. key 59 MENU
2. key 102 HOME
3. key 114 VOLUME_DOWN
4. key 115 VOLUME_UP
5. key 116 POWE WAKE
6. key 143 NOTIFICATION WAKE
7. key 158 BACK
8. key 212 CAMERA
9. key 217 SEARCH
说明:
WAKE: 当设备睡眠时按下此键,设备将被唤醒,按键事件将会被发送到应用程序。
WAKE_DROPPED: 当设备睡眠时按下此键,设备将被唤醒,而按键事件不会被发送到应用程序。
瑞星微的按键分为GPIO和ADC两种,定义在/kernel/arch/arm/boot/dts目录下的firefly-rk3288.dts文件:
1. &adc {
2. status = "okay";
3.
4. key {
5. compatible = "rockchip, key";
6. io-channels = <&adc 1>;
7.
8. vol-up-key {
9. linux, code = <115>;
10. label = "volume up";
11. rockchip, adc_value = <1>;
12. };
13.
14. vol-down-key {
15. linux, code = <114>;
16. label = "volume down";
17. rockchip, adc_value = <170>;
18. };
19. power-key {
20. gpios = <&gpio0 GPIO_A4 GPIO_ACTIVE_LOW>;
21. linux, code = <116>;
22. label = "power";
23. gpio-key, wakeup; // 具有唤醒功能
24. };
25.
26. menu-key {
27. linux, code = <139>;
28. label = "menu";
29. rockchip, adc_value = <355>;
30. };
31. home-key {
32. linux, code = <102>;
33. label = "home";
34. rockchip, adc_value = <746>;
35. };
36. back-key {
37. linux, code = <158>;
38. label = "back";
39. rockchip, adc_value = <560>;
40. };
41. camera-key {
42. linux, code = <212>;
43. label = "camera";
44. rockchip, adc_value = <450>;
45. };
46. };
先在linux内核中添加新的按键值(当然不用宏定义直接写数值也可以),网上一般写在/include/linux/input/input.h文件中添加,实际3.10内核在/include/uapi/ linux/input.h文件中:
#defineKEY_RESERVED 0
#define KEY_ESC 1
#define KEY_1 2
...
#defineKEY_MY 250
对于Android层次,在rk29-keypad.kl文件中增加按键值后,还需要修改一些文件,系统才能处理,首先修
改KeycodeLabels.h文件,4.4版本将其移到了frameworks/native/include/input目录下,对KEYCODES数组添加按键码:
static const KeycodeLabelKEYCODES[] = {
...
{ "
MY_KEYS" ,250},
{ NULL,0 }
最后一定要以NULL结尾,其中的TV_KEYMOUSE_LEFT按键就是瑞星微添加的,再去frameworks/native/include/android/keycode.h文件中添加:enum {
AKEYCODE_UNKNOWN = 0,
....
....
添加
AKEYCODE_MY_KEYS
同样AKEYCODE_TV_KEYMOUSE_LEFT宏也是瑞星微添加的,如果要添加系统按键值,还需要修改
frameworks/base/libs/ui/input.java(android4.4已变为frameworks/native/libs/input/input.cpp)文件:
boolKeyEvent::hasDefaultAction(int32_t keyCode)
{
switch (keyCode) {
case AKEYCODE_HOME:
case AKEYCODE_BACK:
...
AKEYCODE_MY_KEYS:
return true;
还有下面的:
boolKeyEvent::isSystemKey(int32_t keyCode) {
switch (keyCode) {
case AKEYCODE_MENU:
...
AKEYCODE_MY_KEYS:
return true;
}
return false;
}
还要修改frameworks/base/core/java/android/view/KeyEvent.java文件:
public staticfinal int KEYCODE_TV_MEDIA_PAUSE = 249;
KEYCODE_MY_KEYS
private staticfinal int LAST_KEYCODE = KEYCODE_MY_KEYS;
注意一定要修改LAST_KEYCODE,下面的populateKeycodeSymbolicNames数组也需要添加:
KEYCODE_MY_KEYS, " KEYCODE_MY_KEYS ");
修改frameworks/base/core/res/res/values/attr.xml文件:
<!--This enum provides the same keycode values as can be found in
{@link android.view.KeyEvent}. --><attrname="keycode">
<enum name="KEYCODE_UNKNOWN"value="0" />
...
<enumname="KEYCODE_TV_MEDIA_PAUSE" value="249" />
KEYCODE_MY_KEYS" value="250" /></attr>
对于网上说的/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h文件已经移除。
以上文件都改完之后frameworks/base/api/current.txt也要随之更新,如果未更新,可运行 makeupdate-api 进行更新
如果对新键值进行处理,可以通过获取相应的keycode,对它进行处理。对于按键事件的处理一般如下文件中:
frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java
@Override
public intinterceptKeyBeforeQueueing(KeyEvent event, int policyFlags, boolean isScreenOn)
{
...
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_DOWN:
...
KEYCODE_MY_KEYS: // 添加处理代码