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 = ;

pinctrl-1 = ;

key1@1{

label= "key1";

gpios= ;

linux,code= <116>;

linux,input-type = <1>;

};

key2@2{

label= "key2";

gpios= ;

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 116POWER

key102 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 finalint KEYCODE_SYSTEM_NAVIGATION_LEFT = 282;/** Key code constant: Consumed by the system for navigation right*/public static finalint KEYCODE_SYSTEM_NAVIGATION_RIGHT = 283;

private static finalint LAST_KEYCODE =KEYCODE_SYSTEM_NAVIGATION_RIGHT;

...

...

...

}

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

接下来修改资源文件:

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

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

4、按键测试

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

# dumpsys input

输出如下:

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

android 按键kl文件,Android添加新按键相关推荐

  1. 基于MTK6755平台(Android6.0)添加新按键

    第一次写的第一篇博客,如下: 1.在DCT tool keypad list 文件中添加新键,如TRIGGER键: KEY_TRIGGER 源码路径:alps/kernel-3.18/tools/dc ...

  2. android framework资源,android源码framework下添加新资源的方法

    编译带有资源的jar包,需要更改frameworks层,方法如下: 一.增加png类型的图片资源 1.将appupdate模块所有用到的png格式图片拷贝到framework/base/core/re ...

  3. Android中将布局文件/View添加至窗口过程分析 ---- 从setContentView()谈起

    本文主要内容是讲解一个视图View或者一个ViewGroup对象是如何添加至应用程序窗口中的.下文中提到的窗口可泛指我们能看到的界面,包括一个Activity呈现的界面(我们可以将之理解为应用程序窗口 ...

  4. Unity Android平台读取文件时添加了权限依然报错“Access to the path is denied“

    Unity 调用Android读取文件"Access to the path is denied" 添加权限依然报错 记录一下Unity 调用Android读取文件"Ac ...

  5. android创建图片资源文件,Android图片添加水印图片并把图片保存到文件存储的实现代码...

    具体代码如下所示: package zhangphil.test; import android.graphics.Bitmap; import android.graphics.BitmapFact ...

  6. android创建布局文件,android学习——Android Studio下创建menu布局文件

    一.问题: android studio项目中没有看到menu文件夹: 在android studio项目中想要添加menu布局文件,一开始我的做法是:直接在res文件夹右键选择xml文件来添加,如下 ...

  7. android 引入字体文件,Android 导入字体(goolge io 2017)

    随着 Android 开发不断发展和深入,用户对app 要求也不仅只停留在功能和性能,更多地开始关注 app 的 UI了.字体作为 UI 的一部分,而且是重要的部分.已经引起开发者的注意. 图 我们在 ...

  8. android编译.a文件,Android 7.1源码编译导入AS完整教程

    本教程仅针对Android 7.1系统,为便于虚拟机备份和出现问题时的还原,本教程分为3步:初始化编译环境.源码同步.编译源码导入Android Studio. 编译源码:Android7.1.2_r ...

  9. android 颜色资源文件,android中colors.xml颜色设置资源文件的方法

    1. 打开res目录下的values文件夹,双击打开colors.xml文件进行编辑 上代码 #008577 #00574B #D81B60 #ff0000 #0000ff 2. 在res目录下的la ...

最新文章

  1. Scons构建C++项目
  2. 使用 Nginx 搭建图片服务器
  3. 晶科电力打造山东省最大物流港分布式光伏项目
  4. C和指针之const、#define、volatile
  5. 1.1 Machine learning: what and why?
  6. java基础——java基本运算
  7. Java设计模式------工厂模式-------工厂方法模式
  8. 最好用电脑录音软件推荐
  9. Ubuntu校园iNode客户端超简单安装
  10. Windows 2008 R2 SP1 离线安装IE11
  11. 天空之城简谱用计算机,原神天空之城琴谱 数字版简谱分享
  12. 湖南出台不动产登记新规 “小产权房”不予办理
  13. 访问服务器共享文件夹慢,win8系统访问共享时复制文件速度慢的解决方法
  14. Postgresql 使用 Pl/python实现邮件监控
  15. 「CSS畅想」好友想回忆童年,安排~为她做了一个果宝特攻的换装
  16. K-均值聚类(K-means)
  17. MedianFlow中值流跟踪算法源码
  18. 将一串数字转为大写人民币形式
  19. 把一个学生的信息(包括学号、姓名、性别、住址)放在一个结构体变量中,然后输出这个学生的信息
  20. 报表开发知识大全(1) 什么是报表

热门文章

  1. 来给IDEA换个酷炫的主题吧!这几个都有点哇塞啊!
  2. Spring 体系常用项目一览
  3. IntelliJ IDEA 2019 快捷键终极大全,速度收藏!
  4. 说说我为什么看好Spring Cloud Alibaba
  5. 函数重写 java_java 函数的重载和重写实例代码
  6. 16进制ff转化为二进制_3秒钟快速转换十六进制为二进制
  7. java心电图心率计算_java如何画心电图?
  8. linux samba免密码,Ubuntu如何不用密码访问samba服务器
  9. win10安装jdk1.8
  10. 个人副业在家可做大学生首选小程序创业项目