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终端的屏幕将会被点亮,测试完成。
原文地址:https://www.cnblogs.com/Cqlismy/p/11842760.html
- Saltstack自动化操作记录(1)-环境部署
- CentOS源码编译安装Nginx和tcp_proxy module
- 介绍一个MonoTouch开发的伦敦官方城市指南应用
- 虾说区块链-55-《精通比特币》笔记十
- SignalR QuickStart
- Node.js入门学习笔记-IDE选择/配置之WebStorm(windows)
- Captcha插件后门分析和修复
- log4net.SignalR - 日志即时发送客户端页面
- 科学家担心的智能爆炸,真会有这一天吗?
- RSA 2018:从大会议题看2018年网络安全趋势
- Silverlight:Mouse Avoiding 躲避鼠标效果
- CTreeCtrl 控件使用总结
- 在ASP.NET MVC 4中使用Kendo UI Grid
- 每周四更面试题:True+True=?
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 今天抠图,Python实现一键换底片!想换什么换什么(附源码)
- 你想不到的沙雕,8行代码Python实现GIF图倒放,每天的快乐源泉
- python爬虫-首医
- 2万8千张图片如何用python组成一张(简洁明了附源码)
- 10 种常用 Matplotlib 图的 Python 代码
- Python爬取某宝商品数据案例:100页的价格、购买人数等数据
- 如何让你的图片加上一层天气的特效?Python帮你解决(附源码)
- Python最简单的图片爬虫,20行代码带你爬遍整个网站
- 用Python把人物头像动漫化,不同的表情给你不同的惊喜
- python苦短-爬取音乐
- python苦短-灵笼说啥
- python爬虫-八佰词云
- python爬虫-beautifulsoup使用
- 深度学习-卷积神经网络原理
- 深度理论VGG-NET 网络