Android 13----在framworks层映射一个物理按键

基于Android 13.

一、映射步骤

  • 确定要映射的物理按键值

  • 在kl文件中增加键值对

  • 在InputEventLabels.cpp增加AKEYCODE

  • 在keycodes.h中定义AKEYCODE值

  • attrs.xml中增加KEYCODE

  • KeyEvent.java中增加KEYCODE

  • 在PhoneManagerWindow等相关类中进行拦截处理相关KEYCODE,属于具体的业务逻

二、确定要映射的物理按键值 

通过getevent,可以知道对应的物理按键值。
输入getevent后,按一次对应的物理按键,会有相应的值输出:

/dev/input/event0:按键对应的设备节点(也就是getevent读哪个设备节点读出的按键信息)

name:这个设备节点对应的名字,如/dev/input/event0设备节点对应的名字为"gpio-keys"

00b5:按键对应的物理按键值(也就是kernel层冒上来的按键值)

00b5是十六进制值,在frameworks层进行映射的时候需要转化为十进制,为181。

这样就确定了要映射的物理按键值。

三、在kl文件中增加键值对

在kl文件中增加键值对之前,先要找到对应的kl文件。(kl文件即按键布局文件)

通过getevent,可以知道这个按键对应的设备节点,以及设备节点对应的名字:

这个b5按键对应设备节点是/dev/input/event0,这个设备节点对应的name为"gpio-keys"

通过adb shell dumpsys input查看对应的kl文件:

7: gpio-keysClasses: KEYBOARDPath: /dev/input/event0Enabled: trueDescriptor: 485d69228e24f5e46da1598745890b214130dbc4Location: gpio-keys/input0ControllerNumber: 0UniqueId: Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100KeyLayoutFile: /system/usr/keylayout/gpio-keys.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile: VideoDevice: <none>

故我们需要在gpio-keys.kl中增加键值对:

key 181 KEY_XXX

PS:

AOSP原生代码中放置kl的路径:frameworks/base/data/keyboards

设备中放置kl的路径:/system/usr/keylayout

四、在InputEventLabels.cpp增加AKEYCODE

在InputEventLabels.cpp通DEFINE_KEYCODE宏,增加AKEYCODE

frameworks/native/libs/input/InputEventLabels.cpp

DEFINE_KEYCODE(KEY_XXX)

这里有一个小小的地方需要注意下:

#define DEFINE_KEYCODE(key) { #key, AKEYCODE_##key }...
DEFINE_KEYCODE(THUMBS_DOWN), \
DEFINE_KEYCODE(PROFILE_SWITCH), \
DEFINE_KEYCODE(KEY_XXX)/* add by xxx */

在两行DEFINE_KEYCODE之间添加注释的时候,不要采用// comment;会导致编译不过。

DEFINE_KEYCODE外面是个宏,需要用/**/而且不能漏了 \

DEFINE_KEYCODE(PROFILE_SWITCH), \
DEFINE_KEYCODE(KEY_XXX)/* add by ... */或者:
DEFINE_KEYCODE(PROFILE_SWITCH), \
/* add by ... */ \
DEFINE_KEYCODE(KEY_XXX)

五、在keycodes.h中定义AKEYCODE值

在keycodes.h中增加AKEYCODE键值对

frameworks/native/include/android/keycodes.h

/** Used to switch current account that is consuming content.* May be consumed by system to switch current viewer profile. */
AKEYCODE_PROFILE_SWITCH = 288,
/** add by start. */
AKEYCODE_SKY_XXX = 701
/** add by end. */

PS.这个701是自己定义的,只要取比上一个大的值(这里是288)即可,但是考虑到289在attrs.xml中已经被占用,故这里取大一点的值,给AOSP预留一部分取值范围。

六、attrs.xml中增加KEYCODE

在attrs.xml中增加KEYCODE_XXX:

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

<!-- add by  start. -->
<enum name="KEYCODE_KEY_XXX" value="701" />
<!-- add by  end. -->

七、KeyEvent.java中增加KEYCODE

在KeyEvent.java中增加KEYCODE_XXX:

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

/** Key code constant: Demo Application key #4. */public static final int KEYCODE_DEMO_APP_4 = 304;/** add by  start. */public static final int KEYCODE_KEY_XXX = 701;/** add by  end. */

到这里,框架层映射按键值就完成了,接下来进行按键拦截测试。

八、拦截处理

在PhoneManagerWindow等相关类中进行拦截处理相关KEYCODE_XXX,属于具体的业务逻辑。

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

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

相关文章

【Java EE】Mybatis-Plus

1. 开始先进行和以前一样的项目配置、数据库连接配置&#xff0c;在这些基础上&#xff0c;额外引入 Mybatis-Plus 依赖即可。<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><vers…

各版本操作系统对.NET支持情况(250707更新)

借助虚拟机和测试机&#xff0c;检测各版本操作系统对.NET的支持情况。 安装操作系统后&#xff0c;安装相应运行时并能够运行星尘代理或幸运四叶草为通过条件。 测试平台&#xff1a;VMware Workstation 镜像来源&#xff1a;MSDN I Tell You 参考&#xff1a; .NET Fram…

5-Kafka-replication(副本机制)概念

&#x1f504; Kafka 副本机制&#xff08;Replication&#xff09; 核心概念概念说明Replica (副本)分区的完整拷贝&#xff0c;分布在不同 BrokerReplication Factor副本总数&#xff08;含 Leader&#xff09;&#xff0c;生产环境建议 ≥3Leader Replica处理所有读写请求&a…

langgraph的ReAct应用

一、什么是langgraph的ReActLangGraph 中的 ReAct&#xff08;Reasoning Acting&#xff09;代理是一种结合推理与行动能力的 AI 代理架构&#xff0c;通过动态决策链实现复杂任务处理。以下是其核心要点及实践指南。1、ReAct 代理的核心原理1.1工作流程&#xff1a;ReAct 代理…

一个编辑功能所引发的一场知识探索学习之旅(JavaScript、HTML)

文章目录一个编辑功能所引发的一场知识探索学习之旅&#xff08;JavaScript、HTML&#xff09;1. 一个编辑功能案例2. 知识点探索学习3. 参考资料一个编辑功能所引发的一场知识探索学习之旅&#xff08;JavaScript、HTML&#xff09; 1. 一个编辑功能案例 HTML&#xff1a; &l…

kali制作Windows木马

环境描述&#xff1a;攻击机&#xff1a;Kali-2025实验靶机&#xff1a;Windows11不要攻击他人&#xff0c;这只是网络安全实验还是一样获取IP地址制作好之后开服务&#xff0c;上传下载在靶机右键保留下载记得把防火墙&#xff0c;安全中心关了否则无法下载之后就可以kali控制…

从零实现一个GPT 【React + Express】--- 【1】初始化前后端项目,实现模型接入+SSE

摘要 本系列文章主要是实现一个能够对话以及具有文生图等功能的模型应用。主要UI界面会参考chat-gpt,豆包等系列应用。模型使用的是gpt开源的大模型。 如果你是一个前端开发工程师需要一个自己的开源项目&#xff0c;可以学习这个系列的文章&#xff0c;不需要有很完整的后端…

【PTA数据结构 | C语言版】在顺序表 list 的第 i 个位置上插入元素 x

本专栏持续输出数据结构题目集&#xff0c;欢迎订阅。 文章目录题目代码题目 请编写程序&#xff0c;将 n 个整数存入顺序表&#xff0c;对任一给定整数 x&#xff0c;将其插入顺序表中指定的第 i 个位置。注意&#xff1a;i 代表位序&#xff0c;从 1 开始&#xff0c;不是数…

汽车智能化2.0引爆「万亿蛋糕」,谁在改写游戏规则?

进入2025年&#xff0c;长安、奇瑞、比亚迪等各大主机厂纷纷将智能化推进至全新高度&#xff0c;中国汽车智能化竞争进入了“技术市场生态”综合较量阶段。一方面&#xff0c;各大主机厂全力推进辅助驾驶的规模化普及&#xff0c;掀起了一场关于高阶辅助驾驶的“技术平权”革命…

QT 第八讲 --- 控件篇 Widget(三)界面系列

前言&#xff1a; 在上一讲《QT 第七讲 --- 控件篇 &#xff08;二&#xff09;window系列与qrc机制》中&#xff0c;我们探讨了应用程序窗口&#xff08;QMainWindow, QWidget&#xff09;的基础结构、窗口标志、状态以及Qt强大的资源管理机制&#xff08;.qrc文件&#xff0…

广州华锐互动:AR 领域的创新与服务先锋​

&#xff08;一&#xff09;定制化服务​ 广州华锐互动秉持 “以客户为中心” 理念&#xff0c;为客户提供高度定制化 AR 解决方案。项目初期&#xff0c;通过多种方式深入了解客户需求&#xff0c;挖掘痛点。基于需求分析&#xff0c;技术团队运用自主研发技术和先进算法&…

暑假算法日记第一天

目标​&#xff1a;刷完灵神专题训练算法题单 阶段目标&#x1f4cc;&#xff1a;【算法题单】滑动窗口与双指针 LeetCode题目:1456. 定长子串中元音的最大数目643. 子数组最大平均数 I1343. 大小为 K 且平均值大于等于阈值的子数组数目2090. 半径为 k 的子数组平均值2379. 得…

【软考高项】信息系统项目管理师-第1章 信息化发展(1.5 数字化转型与元宇宙、1.6 标题类知识点、1.7 十四五规划内容汇总)

文章大纲 第1章 信息化发展1.5 数字化转型与元宇宙1.5.1 数字化转型1.5.2 元宇宙1.6 标题类知识点1.7 十四五规划内容汇总1.8 10道试题第1章 信息化发展 学习建议: 此章内容大部分为新增内容,基本是全新的章节2023年5月考试2分选择,5分案例2023年下半年各批次选择题2分左右1.…

STM32F103C8T6单片机内部执行原理及启动流程详解

引言&#xff1a;为什么深入理解STM32启动流程很重要&#xff1f;STM32F103C8T6作为嵌入式开发中最常用的单片机之一&#xff0c;其内部执行原理和启动流程是理解嵌入式系统底层运行机制的核心。无论是开发Bootloader、调试HardFault异常&#xff0c;还是优化系统启动速度&…

【python 常用的数学科学/计算机视觉等工具】

当然有&#xff01;在科学计算、机器学习、图像处理等领域&#xff0c;scikit-learn、scikit-image&#xff08;skimage&#xff09;、SciPy、OpenCV 是非常重要的库&#xff0c;但它们不是唯一的。以下是一些与它们类似或互补的项目&#xff0c;按照用途分类列出&#xff1a; …

LUMP+NFS架构的Discuz论坛部署

一、配置准备 每台主机都安装mysql、nfs、php、mysql 对每台主机都进行关闭防火墙、上下文等&#xff0c;减少阻碍[rooteveryone ~]# systemctl stop firewalld [rooteveryone ~]# setenforce 0安装插件等[rootlocalhost mysql]# yum install -y nfs-utils nginx [rootlocalho…

C++STL-deque

一.基础概念deque和vector一样都是对元素的操作&#xff0c;不同点&#xff1a;vector对元素增删后元素会往前或往后移&#xff0c;如果数据不大没有太多影响&#xff0c;如果数据很大效率会变低&#xff1b;deque对元素增删不会使元素位置改变&#xff0c;所有效率会变高。二.…

字节跳动高质量声音克龙文字转语音合成软件MegaTTS3整合包

MegaTTS3是抖音团队联合国内其他大学研发的一款语音合成及声音克龙应用&#xff0c;可实现零样本语音克龙及富有情感的自然语音合成。我基于当前最新版制作了免安装一键启动整合包。 MegaTTS3介绍 MegaTTS 3 是字节跳动&#xff08;ByteDance&#xff09;与浙江大学联合开发的…

RPC:远程过程调用机制

目录 1、概念 2、RPC架构 2.1 RPC的四个核心组件 2.2 访问流程 3、关键概念 3.1 接口定义语言 (IDL - Interface Definition Language) 3.2 序列化与反序列化 (Serialization & Deserialization - Marshalling/Unmarshalling) 3.3 网络传输 (Transport) 3.4 服务发…

EPLAN 电气制图(六):电机正反转副勾主电路绘制

一、项目背景&#xff1a;为什么绘制电机正反转主电路&#xff1f; 在多功能天车系统中&#xff0c;电机正反转控制是核心功能之一。通过 EPLAN 绘制主电路&#xff0c;不仅能清晰展示电源分配、换相逻辑和线缆连接&#xff0c;还能为后续 PLC 控制设计奠定基础。本次以西门子设…