1、前言

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

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

2、内核添加设备节点

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

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

在该设备树节点中,定义了两个按键,分别是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    POWER
key 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,  }
};

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

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

添加内容如下:

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

还需要修改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 = ;
/** Key code constant: Consumed by the system for navigation right */
public static final int KEYCODE_SYSTEM_NAVIGATION_RIGHT = ;
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终端的屏幕将会被点亮,测试完成。

Android添加新按键的更多相关文章

  1. android 添加新的键值,自定义按键-2【转】

    本文转载自:http://blog.csdn.net/mr_raptor/article/details/8053871 在Android中,上层可使用的键值默认情况下是92个,从0-91:一般情况下 ...

  2. android 添加新的键值,自定义按键【转】

    本文转载自:http://blog.csdn.net/mr_raptor/article/details/8053871 在Android中,上层可使用的键值默认情况下是92个,从0-91:一般情况下 ...

  3. android 添加一个按键键值【转】

    本文转载自:http://blog.csdn.net/u012719256/article/details/52526046 1.frameworks/base/data/keyboards/Gene ...

  4. cocos2d-x android 添加新场景报错: undefined reference to `vtable for XXX'

    转载自 居家懒人 http://www.cnblogs.com/JD85/archive/2012/09/17/2688128.html 加入写了新场景SecondScene,结果在cpp文件里类名地 ...

  5. Android 添加新的Activity

    1.右键, New一个Class ,文件名如:ParaSetActivity.java 注: Superclass要选择android.app.Activity ,没有直接写入android.app. ...

  6. Android下添加新的自定义键值和按键处理流程

            Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...

  7. Android下添加新的自定义键值和按键处理流程【转】

    本文转载自: Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我一 ...

  8. Android自定义视图一:扩展现有的视图,添加新的XML属性

    这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...

  9. Android学习笔记之Android Studio添加新的Activity

    1.创建Android项目工程:AndroidTest 创建过程可参考网上诸多教程. 2.添加新的Activity,步骤如下 a. 在layout文件夹上右键,New-Activity-相应Activ ...

随机推荐

  1. 以STM32和FPGA为核心的多组件协调工作系统

  2. 【微信原生支付】服务商模式-小微商户专属接口:小微商户新增对应APPID关联API

    文档地址:https://pay.weixin.qq.com/wiki/doc/api/xiaowei.php?chapter=20_3&index=3 这个接口比较特殊不需要nonce_st ...

  3. Java学习——BigInteger类和BigDecimal类

    Java学习——BigInteger类和BigDecimal类 摘要:本文主要学习了用于大数字运算的BigInteger类和BigDecimal类. 部分内容来自以下博客: https://www.c ...

  4. 云顶之弈换中立python脚本

    import pynput keyboard = pynput.keyboard.Controller() mouse = pynput.mouse.Controller() def on_relea ...

  5. Vue-cli3脚手架工具快速创建一个项目

    1.首先全局安装一下vue-cli3 npm install -g @vue/cli 或 yarn global add @vue/cli vue -V查看版本(这里注意V是大写哦) 2.vue cr ...

  6. 达能依靠Matrikon进行数据存储和分析

    达能是一家致力于通过食品实现健康的公司,业务遍及五大洲130多个国家.在罗马尼亚,达能每天在布加勒斯特的工厂生产100万瓶酸奶.由于质量和产品安全在达能最为重要,因此监控和分析工业过程需要非常高效才能 ...

  7. springBoot添加日志管理

    一. 近期自己的项目想要一个记录日志的功能,而springboot本身就内置了日志功能,然而想要输入想要的日志,并且输出到磁盘,然后按天归档,或者日志的切分什么的,自带的日志仅仅具有简单的功能,百度了 ...

  8. 数据库系统(五)---MySQL基础

    一.SQL基本概念: SQL 已经成为关系数据库的标准语言,是一种数据库查询和程序设计语言,用 于存取数据以及查询.更新和管理关系数据库系统. 功能不仅仅是查询,还包括数据定义.数据操纵和数据控制等于 ...

  9. 【学习笔记】兄弟连LINUX视屏教程(沈超 李明)

    发现自己的linux水平楞个瓜皮,找个视屏教程学习一哈 1 linux系统简介 1.1 UNIX和Linux发展史 unix发展历史:1969年,美国贝尔实验室的肯.汤普森开发出unix系统,1971 ...

  10. Tomcat部署项目时,发布的项目页面部分乱码,且页面渲染文件也是乱码。

    catalina.bat中必须设置为UTF-8,如果我不设置为UTF-8,页面接收到的就是乱码了,尝试过各种UTF-8的调试,都无解,最后还是只能在catalina.bat的set "JAV ...