Android 自定义按键添加流程

news2025/2/4 22:04:34

c6bbebd66e476a9e4c506e2b1b68ff8e.gif

和你一起终身学习,这里是程序员Android

经典好文推荐,通过阅读本文,您将收获以下知识点:

一、驱动通过GPIO连接的按键
二、Framework 层添加按键响应方法
三、参考文献

一、驱动通过GPIO连接的按键

此类按键采用GPIO来连接,通过监测其中断来判断按键的动作,需要根据具体硬件设计在项目对应的dts文件配置gpio_keys节点。

底层驱动主要修改以下两个文件上报键值。

1.修改 sp9863a-3c10.dts

修改方法如下:

bsp/kernel/kernel4.14/arch/arm64/boot/dts/sprd/sp9863a-3c10.dts
    gpio-keys {
        compatible = "gpio-keys";
        key-power {
            label = "Power Key";
            linux,code = <KEY_POWER>;
            gpios = <&pmic_eic 1 GPIO_ACTIVE_LOW>;
            debounce-interval = <2>;
            wakeup-source;
        };
+
+               key-smart {
+                       label = "Smart Key";
+                       linux,code = <KEY_OK>;/* linux下的key code,linux下input.h中有定义键值 */
+                       gpios = <&ap_gpio 53 GPIO_ACTIVE_LOW>;/* 按键连接的GPIO */
+                       debounce-interval = <2>;/* 按键去抖时间,单位ms,如果出现按键不稳定,请适当加大 */
+                       wakeup-source;
+               };
    };

2. 修改pinmap-sp9863a.c文件

修改方法如下:

+++ /bsp/bootloader/u-boot15/board/spreadtrum/sp9863a_3c10/pinmap-sp9863a.c
@@ -348,8 +348,8 @@ static pinmap_t pinmap[]={
 {REG_MISC_PIN_LVDSRF0_DACON,            BITS_PIN_DS(1)|BIT_PIN_NULL|BIT_PIN_NUL|BIT_PIN_SLP_AP|BIT_PIN_SLP_NUL|BIT_PIN_SLP_OE},//LCM_SOURCE_AVEEEN
 {REG_PIN_SPI2_CSN,                      BITS_PIN_AF(2)},
 {REG_MISC_PIN_SPI2_CSN,                 BITS_PIN_DS(1)|BIT_PIN_NULL|BIT_PIN_WPU|BIT_PIN_SLP_CM4|BIT_PIN_SLP_WPU|BIT_PIN_SLP_IE},//PROX_INT
-{REG_PIN_SPI2_DO,                       BITS_PIN_AF(2)},
-{REG_MISC_PIN_SPI2_DO,                  BITS_PIN_DS(1)|BIT_PIN_NULL|BIT_PIN_NUL|BIT_PIN_SLP_CM4|BIT_PIN_SLP_NUL|BIT_PIN_SLP_OE},//M_RSTN
+{REG_PIN_SPI2_DO,                       BITS_PIN_AF(3)},
+{REG_MISC_PIN_SPI2_DO,                  BITS_PIN_DS(1)|BIT_PIN_NULL|BIT_PIN_WPU|BIT_PIN_SLP_AP|BIT_PIN_SLP_WPU|BIT_PIN_SLP_IE},//SMART_KEY
 {REG_PIN_SPI2_DI,                       BITS_PIN_AF(3)},
 {REG_MISC_PIN_SPI2_DI,                  BITS_PIN_DS(1)|BIT_PIN_NULL|BIT_PIN_WPD|BIT_PIN_SLP_AP|BIT_PIN_SLP_WPD|BIT_PIN_SLP_Z},//NC
 {REG_PIN_SPI2_CLK,                      BITS_PIN_AF(2)},

二、Framework 层添加按键响应方法

通过getevent查看驱动调节的按键值是否上传ok。

命令查看方法如下:

C:\Users\Administrator>adb shell getevent
 
/dev/input/event2: 0001 0160 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 0160 00000000
/dev/input/event2: 0000 0000 00000000

其中:
0160: 是十六进制数,对应十进制数为352.
10: 是指按下和弹起的动作。

1.在 gpio-keys.kl 文件中添加自定义key值

在kl文件中我们可以仿照power键添加key 值。

+++ b/Android/device/sprd/sharkl3/common/rootdir/system/usr/keylayout/gpio-keys.kl
@@ -3,3 +3,4 @@ key 115     VOLUME_UP       WAKE
 key 116     POWER           WAKE
 key 212     CAMERA          WAKE
 key 0x210   FOCUS           WAKE
+key 352     KEY_OK          WAKE

这样就可以完成物理按键 kl 文件到 KEY_OK的映射。

这个kl 文件是通过DeviceCommon.mk中编译到系统中,在手机/system/usr/keylayout目录下可以找到。
不同平台代码可能存在差异。

device\sprd\sharkl3\common\DeviceCommon.mk的部分代码如下:

PRODUCT_COPY_FILES += \
    $(LOCAL_PATH)/rootdir/root/init.common.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.common.rc \
    $(LOCAL_PATH)/recovery/init.recovery.common.rc:root/init.recovery.common.rc \
    $(BOARDDIR)/recovery/init.recovery.$(TARGET_BOARD).rc:root/init.recovery.$(TARGET_BOARD).rc \
    $(LOCAL_PATH)/rootdir/system/usr/keylayout/gpio-keys.kl:$(TARGET_COPY_OUT_VENDOR)/usr/keylayout/gpio-keys.kl \

2. 在Generic.kl 文件中添加key 值

修改方法如下:

+++ b/Android/frameworks/base/data/keyboards/Generic.kl
@@ -299,7 +299,7 @@ key 317   BUTTON_THUMBL
 key 318   BUTTON_THUMBR

-# key 352 "KEY_OK"
+key 352   KEY_OK
 key 353   DPAD_CENTER
 # key 354 "KEY_GOTO"
 # key 355 "KEY_CLEAR"

3.在 qwerty.kl文件中添加key值

修改方法如下:

+++ b/Android/frameworks/base/data/keyboards/qwerty.kl
@@ -129,3 +129,4 @@ key 581   STEM_PRIMARY
 key 582   STEM_1
 key 583   STEM_2
 key 584   STEM_3
+key 352   KEY_OK

4.在Native 层添加keycode 值与标签

注意下面的289 keycode 值,是延续上面288 keycode 的值,跟驱动上报的352不一样,那是底层的数值,上层最好跟底层差分。

修改方法如下:

+++ b/Android/frameworks/native/include/android/keycodes.h
@@ -776,8 +776,11 @@ enum {
     AKEYCODE_THUMBS_DOWN = 287,
     /** Used to switch current account that is consuming content.
      * May be consumed by system to switch current viewer profile. */
-    AKEYCODE_PROFILE_SWITCH = 288
-
+    AKEYCODE_PROFILE_SWITCH = 288,
+    /**
+       *Nokia custom key 
+       **/
+    AKEYCODE_KEY_OK = 289,

同样我们仿照288的定义,在InputEventLabels.h 添加标签定义

+++ b/Android/frameworks/native/include/input/InputEventLabels.h
@@ -328,7 +328,7 @@ static const InputEventLabel KEYCODES[] = {
     DEFINE_KEYCODE(THUMBS_UP),
     DEFINE_KEYCODE(THUMBS_DOWN),
     DEFINE_KEYCODE(PROFILE_SWITCH),
+    DEFINE_KEYCODE(KEY_OK),

5. 在attrs.xml 中添加属性值

修改方法如下:

+++ b/Android/frameworks/base/core/res/res/values/attrs.xml
@@ -1924,6 +1924,7 @@
         <enum name="KEYCODE_THUMBS_UP" value="286" />
         <enum name="KEYCODE_THUMBS_DOWN" value="287" />
         <enum name="KEYCODE_PROFILE_SWITCH" value="288" />
+               <enum name="KEYCODE_KEY_OK" value="289" />
     </attr>

6.在KeyEvent 中添加key 值方便PhoneWindowMangager中调用

修改方法如下:

+++ b/Android/frameworks/base/core/java/android/view/KeyEvent.java
@@ -823,6 +823,11 @@ public class KeyEvent extends InputEvent implements Parcelable {
      * consuming content. May be consumed by system to set account globally.
      */
     public static final int KEYCODE_PROFILE_SWITCH = 288;
+        /**
+     * Integer value of the last KEYCODE. Nokia custom  ok key.
+     * @hide
+     */
+       public static final int KEYCODE_KEY_OK = 289;

7. 最后我们在PhoneWindowManager 中处理按键行为

调通之后,我们就可以在PWM 的interceptKeyBeforeDispatchingInner方法处理我们想做的事情,比如 吊起Google Assist等。

+++ b/Android/frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

@@ -2870,7 +2870,15 @@ public class PhoneWindowManager extends AbsPhoneWindowManager implements WindowM
         if (mPendingCapsLockToggle && !KeyEvent.isMetaKey(keyCode) && !KeyEvent.isAltKey(keyCode)) {
             mPendingCapsLockToggle = false;
         }
-
+               // add for key ok
+               if(keyCode == KeyEvent.KEYCODE_KEY_OK){
+                       if("Nokia_India".equals(android.os.Build.CUSTOMER_SKU)){
+                         // launch Google Assist
+                         launchAssistAction(null, event.getDeviceId());
+                       }
+                       return -1;
+               }
+               // add for key ok
关注程序员Android,回复按键添加,既可获取完整代码。

参考文献:

【腾讯文档】Android Framework 知识库
https://docs.qq.com/doc/DSXBmSG9VbEROUXF5

友情推荐:

Android 开发干货集锦

至此,本篇已结束。转载网络的文章,小编觉得很优秀,欢迎点击阅读原文,支持原创作者,如有侵权,恳请联系小编删除,欢迎您的建议与指正。同时期待您的关注,感谢您的阅读,谢谢!

50d708a1dc1886fff146babf3df56833.jpeg

点击阅读原文,为大佬点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/761751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

变压器试验介质损耗

试验目的 介质损耗因数 tanδ (% ) 是判断变压器绝缘状态的一种较有效的手段, 主要用来检 查变压器整体受潮、 油质劣化及严重的局部缺陷等, 但不一定能发现变压器局部受潮 等集中性局部缺陷。 试验设备 异频介质损耗测试仪 厂家&#xff1a; 湖北众拓高试 试验接线 (1) 介…

MacBook M1 VulnHub靶机搭建(arm Mac搭建x86 ova镜像)

个人博客: xzajyjs.cn 自从换了M1系的arm Mac后&#xff0c;原本的Vulnhub上的几乎所有靶场按照之前的方法都无法正常搭建了&#xff08;VirtualBox&#xff09;&#xff0c;在外网论坛上找了一遍&#xff0c;有一个相对麻烦一些的替代方法&#xff0c;但效果还是不错的&#x…

MFC演示双缓冲绘图算法

VC6新建一个单文档工程&#xff1b; 先添加一个小球类&#xff1b; 头文件和cpp文件如下&#xff1b; #if !defined(AFX_SPHERE_H__835B2B85_5B12_4409_AEC0_9C5062625DDE__INCLUDED_) #define AFX_SPHERE_H__835B2B85_5B12_4409_AEC0_9C5062625DDE__INCLUDED_#if _MSC_VER &…

MySQL-DQL-基本查询

数据库操作DQL语句 DQL DQL英文全称Data Query Language&#xff08;数据查询语言&#xff09;&#xff0c;用来查询数据库表中的记录关键词&#xff1a;SELECT语法 基本查询条件查询&#xff08;where&#xff09;分组查询&#xff08;group by&#xff09;排序查询&#xff0…

智能办公解决方案——电子标签

智能电子办公标签概要&#xff1a; 电子会议桌牌它外形美观大方&#xff0c;完全取代了传统塑料、纸质或铜制桌牌&#xff0c;是会议桌面显示设备的一大创新&#xff0c;与传统桌牌相比&#xff0c;具有信息化程度高、可反复使用的特点&#xff0c;是现代信息化会议的理想工具…

小物体检测、分割论文

文章目录 2023CaraNet: Context Axial Reverse Attention Network for Segmentation of Small Medical Objects 2023 CaraNet: Context Axial Reverse Attention Network for Segmentation of Small Medical Objects 摘要&#xff1a; 目的&#xff1a;准确、可靠地分割医学图…

Ubuntu 考虑采用新的 “统一默认安装 (unified default install)”

导读Ubuntu安装程序中的 “最小化安装” (Minimal installation) 是该发行版多年来最受欢迎的功能之一。 当用户选择 Ubuntu 的 “最小化安装” 选项时&#xff0c;可以在安装更少的预装应用程序情况下&#xff0c;获得完整、功能齐全的 Ubuntu 系统。 但这个功能可能要被砍掉…

【CSDN新星计划】初阶牛C/C++赛道——顺序程序设计(C语句②)

目录 3.2 最基本的语句——赋值语句 3.2 最基本的语句——赋值语句 在C程序中最常用的语句是:赋值语句和输入输出语句。其中最基本的是赋值语句程序中的计算功能大部分是由赋值语句实现的,几乎每一个有实用价值的程序都包括赋值语句。有的程序中的大部分语句都是赋值语句。先介…

进程间通信之命名管道

进程间通信之命名管道 命名管道1.命名管道概念2.创建一个命名管道2.1用命名管道实现通信2.2用命名管道实现server&client通信 命名管道 1.命名管道概念 管道应用的一个限制就是只能在具有共同祖先&#xff08;具有亲缘关系&#xff09;的进程间通信&#xff0c;这种通信可…

高并发的哲学原理(十)-- 理论无限容量:站在地球表面

前面两篇文章每一篇都花了我五十个小时以上&#xff0c;写的我是欲仙欲死&#xff0c;本文我们来务点虚&#xff0c;上上价值。 我们将从微服务架构讲起&#xff0c;一步一步追根溯源&#xff0c;找寻“分布式数据库”在另一个维度的投影&#xff0c;探寻基建、应用、服务、组织…

Java:运算符、位运算 的运算规则与用法详解

目录 运算符Math数学函数与常量类型转换强制类型转换自增和自减运算符关系运算符三元运算符 位运算& 与| 或^ 异或~ 按位取反<< >> 左移 右移运算符优先级 运算符 Math数学函数与常量 import java.lang.Math.*; public class Test{public static void main(S…

java项目之智能仓储系统(ssm+mysql+jsp)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于ssm的智能仓储系统。技术交流和部署相关看文章末尾&#xff01; 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&…

十八、网页端在移动端的像素

一、简介 -1. 在不同的屏幕&#xff0c;单位像素的大小是不同的&#xff0c;像素越小&#xff0c;屏幕越清晰。 手机端的像素就是宽度和高度&#xff0c;如iphone6 4.7寸 750 x 1334。 -2. 手机的像素点 远远小于 计算机的像素点。 问题&#xff1a;一个宽度为900px的网页在i…

探索AI图像安全,助力可信AI发展

探索AI图像安全&#xff0c;助力可信AI发展 0. 前言1. 人工智能发展与安全挑战1.1 人工智能及其发展1.2 人工智能安全挑战 2. WAIC 2023 多模态基础大模型的可信 AI2.1 WAIC 2023 专题论坛2.2 走进合合信息 3. AI 图像安全3.1 图像篡改检测3.2 生成式图像鉴别3.3 OCR 对抗攻击技…

这所211保护一志愿,但复试太难了,考八门课!

一、学校及专业介绍 华中师范大学&#xff08;Central China Normal University&#xff09;&#xff0c;简称“华中师大”&#xff0c;位于湖北省武汉市&#xff0c;是中华人民共和国教育部直属重点综合性师范大学&#xff0c;位列国家“双一流”、“211工程”、“985工程优势…

C++ 在线刷题网站

文章目录 1. 前言2. 效果展示3. 框架4. common4.1 工具类4.2 日志 5. 编译5.1 前言5.2 正文5.3 PathUtil5.4 Compile 6. 运行6.1 限制进程资源6.2 Run 7. 执行7.1 json7.2 Start 参数7.3 FileUtil7.4 Start 8. 启动服务8.1 安装 httplib8.2 compile_server.cpp 9. 测试 compile…

前端学习记录~2023.7.15~CSS杂记 Day7

前言一、介绍 CSS 布局1、正常布局流2、display 属性3、弹性盒子&#xff08;1&#xff09;设置 display&#xff1a;flex&#xff08;2&#xff09;设置 flex 属性 4、Grid 布局&#xff08;1&#xff09;设置 display&#xff1a;grid&#xff08;2&#xff09;在网格内放置元…

吴恩达教授深度学习--神经风格转换算法

什么是神经风格迁移&#xff1f; 假设你有一张内容图片C&#xff08;Content&#xff09;和一张具有独特风格S&#xff08;Style&#xff09;的图片&#xff0c;神经风格迁移可以让这两张图片结合&#xff0c;让原始图片具有图片S的风格。所以神经风格迁移可以解决的问题是&am…

Kafka 入门到起飞系列 - 磁盘存储 -零拷贝

Redis 是 在内存存储数据的&#xff0c;数据读取时不要经过磁盘的IO&#xff0c;只需要内存的操作&#xff0c;这也是redis访问速度快的原因 Kafka背道而驰&#xff0c;Kafka 是在磁盘存储数据的&#xff0c;发送过来的数据交给Kafka后会落盘&#xff0c;消费者读取数据时&…

【C++11】function包装器和bind包装器的简单使用

function function 包装器一些场景下模板的低效性包装器 function 修复问题包装成员函数的注意事项一道例题function包装器的意义 bind 包装器bind 包装器介绍bind 包装器可调整传参顺序bind 包装器可绑定固定参数bind 包装器的意义 C11提供了多个包装器&#xff08;wrapper,也…