Android系统添加自定义按键

发布时间:2025-04-28 03:06

如何在Windows系统中自定义桌面快捷键 #生活技巧# #数码产品使用技巧# #电脑操作指南#

网上存在一些关于Android系统添加自定义按键的文章,但大多针对Android2.3和4.0系统的,许多文件都已经变动位置了,这两天我总结了一些,写出来欢迎大家交流与指正:

     Android系统通过*.kl文件将Linux按键传给上层,最新的Android4.4已经不再默认qwerty.kl文件了,代之的是frameworks/base/data/keyboards/Generic.kl文件,当然如果定义板级键值文件,还是以rk29-keypad.kl文件优先。

    在3288/device/rockchip/rksdk目录下的rk29-keypad.kl文件中有相关键值的定义:

key 59    MENUkey 102   HOMEkey 114   VOLUME_DOWNkey 115   VOLUME_UPkey 116   POWE                WAKEkey 143   NOTIFICATION       WAKEkey 158   BACKkey 212   CAMERAkey 217   SEARCH

复制代码

说明:

WAKE: 当设备睡眠时按下此键,设备将被唤醒,按键事件将会被发送到应用程序。

WAKE_DROPPED: 当设备睡眠时按下此键,设备将被唤醒,而按键事件不会被发送到应用程序。

       瑞星微的按键分为GPIO和ADC两种,定义在/kernel/arch/arm/boot/dts目录下的firefly-rk3288.dts文件:

&adc {                  status = "okay";           key {                                compatible = "rockchip, key";                                io-channels = <&adc 1>;                  vol-up-key {                                                linux, code = <115>;                                                label = "volume up";                                                rockchip, adc_value = <1>;                                };                  vol-down-key {                                               linux, code = <114>;                                               label = "volume down";                                               rockchip, adc_value = <170>;                                };                 power-key {                                               gpios = <&gpio0 GPIO_A4 GPIO_ACTIVE_LOW>;                                               linux, code = <116>;                                            label = "power";                                              gpio-key, wakeup;  // 具有唤醒功能                                };                  menu-key {                                               linux, code = <139>;                                               label = "menu";                                              rockchip, adc_value = <355>;                          };                 home-key {                                     linux, code = <102>;                      label = "home";                      rockchip, adc_value = <746>;                };                back-key {                      linux, code = <158>;                      label = "back";                      rockchip, adc_value = <560>;               };               camera-key {                      linux, code = <212>;                      label = "camera";                      rockchip, adc_value = <450>;              };               };

复制代码

       先在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  =250,


       同样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:

        ...

        case AKEYCODE_MY_KEYS:

            return true;

        还有下面的:

boolKeyEvent::isSystemKey(int32_t keyCode) {

    switch (keyCode) {

        case AKEYCODE_MENU:

        ...

        case AKEYCODE_MY_KEYS:

            return true;

    }

        return false;

}

       还要修改frameworks/base/core/java/android/view/KeyEvent.java文件:
public staticfinal int KEYCODE_TV_MEDIA_PAUSE = 249;

public staticfinal int KEYCODE_MY_KEYS        = 250;

private staticfinal int LAST_KEYCODE = KEYCODE_MY_KEYS;


       注意一定要修改LAST_KEYCODE,下面的populateKeycodeSymbolicNames数组也需要添加:

names.append(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" />

       <enum name="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:

      ...

      case KeyEvent. KEYCODE_MY_KEYS:  // 添加处理代码

网址:Android系统添加自定义按键 https://www.yuejiaxmz.com/news/view/888635

相关内容

Android中添加自定义按键
Android系统优化
这一次,让 Android 应用重新定义智能:效率篇
Android应用:一键快速将家务添加到谷歌日历
超详细的Android系统50大必备秘籍分享
基于 Android 的日程管理系统的设计与实现
自定义通知铃声
android 修改系统默认语言
揭秘Android系统:三大关键特性助你玩转智能生活
Android自定义控件——自定义属性

随便看看