zoukankan      html  css  js  c++  java
  • Android添加新按键

    1、前言

    在Android开发中可能会遇到添加新的按键的需求,本文将简单介绍如何在Android系统中完成一个新的按键的添加。

    当系统有新的按键需要添加时,Linux内核下的键码到Android系统中键码是如何进行转换映射的?

    2、内核添加设备节点

    首先,我们需要在Linux内核添加新的按键值,在Linux内核中提供了按键的驱动程序gpio_keys.c,该驱动是基于设备树实现的,因此,先添加自己的设备节点,如下:

    gpio_keys {
        status = "okay";
        compatible = "gpio-keys";
        #address-cells = <1>;
        #size-cells = <0>;
        input-name = "test-keys";
        pinctrl-names = "tlmm_gpio_key_active","tlmm_gpio_key_suspend";
        pinctrl-0 = <&gpio_key_active>;
        pinctrl-1 = <&gpio_key_suspend>;
        
        key1@1 {
            label = "key1";
            gpios = <&msm_gpio 96 1>;
            linux,code = <116>;
            linux,input-type = <1>;
        };
        
        key2@2 {
            label = "key2";
            gpios = <&msm_gpio 98 0>;
            linux,code = <102>;
            linux,input-type = <1>;
        };
    };

    在该设备树节点中,定义了两个按键,分别是key1(键码值为116)和key2(键码值为102),关于该设备节点的更详细介绍,可以查看下面的设备树绑定文档:

    AOSP/kernel/Documentation/devicetree/bindings/gpio/gpio_keys.txt

    关于Linux内核中的键码值定义在文件:

    AOSP/kernel/include/uapi/linux/input.h

    键码值如下所示:

    #define KEY_RESERVED        0
    #define KEY_ESC            1
    #define KEY_1            2
    #define KEY_2            3
    #define KEY_3            4
    #define KEY_4            5
    #define KEY_5            6
    #define KEY_6            7
    #define KEY_7            8
    ...
    ...
    ...

    添加设备树节点完成后,将Linux内核进行编译并烧写,查看新添加的设备节点是否已经添加完成:

    $ cd/sys/class/input/input2/device
    $ cat uevent

    查看设备节点的uevent信息,如下所示,则在Linux内核中完成了新的按键设备节点添加:

    3、键值上报到应用层

    在上面,已经完成了Linux内核中按键的设备节点的添加,但是这仅仅是在Linux内核里面的键值,因此,我们需要修改按键的布局文件,并完成按键的键值上报到应用层。

    (1)添加按键布局文件

    按键布局文件是用来完成映射过程的,文件以kl结尾,用于将Linux内核中input子系统上报的键值转换成对应得按键值供Android系统上层使用,在下面的目录添加test-keys.kl文件:

    AOSP/device/qcom/msm8909/

    如下所示:

    key 116   POWER
    key 102   HOME

    需要注意的是,按键布局文件的名称必须与input输入设备的名称一致,否则将EvenHub在加载设备时将找不到对应得kl文件而加载默认的kl文件,从而键值转换错误,在kl文件中,key是固定的,中间的数字代表的是Linux内核对应得键码。

    接下来需要将按键的kl文件添加到系统中:

    在AndroidBoard.mk中添加编译的命令,文件如下:

    AOSP/device/qcom/msm8909/AndroidBoard.mk

    添加的内容如下:

    include $(CLEAR_VARS)
    LOCAL_MODULE        := test-keys.kl
    LOCAL_MODULE_TAGS    := optional eng
    LOCAL_MODULE_CLASS    := ETC
    LOCAL_SRC_FILES        := $(LOCAL_MODULE)
    LOCAL_MODULE_PATH    := $(TARGET_OUT_KEYLAYOUT)
    include $(BUILD_PREBUILT)

    修改base.mk文件,否则该kl文件将不会被打包,文件如下:

    AOSP/device/qcom/common/base.mk

    添加内容如下:

    # add new kl
    KEYPAD += test-keys.kl

    (2)Android上层添加按键

    在上面,我们已经完成了按键布局文件的添加,接下来将在Android Framework层完成按键的添加。

    需要注意的是,在实例中,关于POWER和HOME的按键,Android系统中默认已经定义了,如果需要添加新的,则需要自己完成定义:

    首先需要添加按键对应得KeycodeLable,文件:

    AOSP/frameworks/native/include/input/InputEventLabels.h

    添加内容如下:

    static const InputEventLabel KEYCODES[] = {
        ...
        ...

          DEFINE_KEYCODE(SYSTEM_NAVIGATION_LEFT),
          DEFINE_KEYCODE(SYSTEM_NAVIGATION_RIGHT),

        { NULL, 0 }
    };

    接下来,进行键码定义,在文件:

    AOSP/frameworks/native/include/android/keycodes.h

    添加内容如下:

    enum {
    ...
    ...
    /** fingerprint navigation key, left. */ AKEYCODE_SYSTEM_NAVIGATION_LEFT = 282, /** fingerprint navigation key, right. */ AKEYCODE_SYSTEM_NAVIGATION_RIGHT = 283 };

    还需要修改java定义,在文件:

    AOSP/frameworks/base/core/java/android/view/KeyEvent.java

    添加内容如下:

    public class KeyEvent extends InputEvent implements Parcelable {
        ...
        ...
        ...
        /** Key code constant: Consumed by the system for navigation left*/
        public static final int KEYCODE_SYSTEM_NAVIGATION_LEFT = 282;
        /** Key code constant: Consumed by the system for navigation right */
        public static final int KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283;
    private static final
    int LAST_KEYCODE = KEYCODE_SYSTEM_NAVIGATION_RIGHT; ... ... ... }

    需要注意的是,该文件的键码必须与前面定义的一致。

    接下来修改资源文件:

    AOSP/frameworks/base/core/res/res/values/attrs.xml

    到这里,Android系统添加新键值就完成了,接下来进行按键测试。

    4、按键测试

    将系统重新编译,并且将新的镜像进行烧写,使用下面命令查看,新的按键与布局文件:

    # dumpsys input

    输出如下:

    从打印的结果来看,已经匹配上对应得keylayout文件,在上面的添加实例为POWER相应的键值,当按键被触发后,Android终端的屏幕将会被点亮,测试完成。

  • 相关阅读:
    收藏一些常用的methods
    判断DOM是否全屏及相关API
    原生post 协议提交文件流 至OSS服务器
    vue 嵌套路由,router-link-active的问题
    关于JAVA变量,数据类型,基本数据类型之间的转换和对象型的基本数据类型
    关于循环语法
    java环境变量的设置
    java的运行机制, JVM
    2-ser2003系统封装实验报告
    1-ser2008系统封装实验报告
  • 原文地址:https://www.cnblogs.com/Cqlismy/p/11842760.html
Copyright © 2011-2022 走看看