Android 键值映射
- 1.修改按键的键值映射
- 2.添加新设备kl
- 1. 设备kl命名规则1:以设备名命名
- 2. 设备kl命名规则2:以设备的vid,pid,version命名(version为可选)
- 3.新增自定义键值并进行键值映射
- 4. 使映射的按键为唤醒按键
- 5. 验证按键映射工具
- 编译
- 使用
- 6.相关问题
1.修改按键的键值映射
- 修改键值映射,首先要获取到上报的按键键值,使用getevent来获取
rk3399pro:/ $ getevent
add device 1: /dev/input/event2name: "adc-keys"
add device 2: /dev/input/event4name: "Wireless Dongle Wireless Dongle"
add device 3: /dev/input/event5name: "Wireless Dongle Wireless Dongle"
add device 4: /dev/input/event3name: "rockchip,rk809-codec Headphone Jack"
add device 5: /dev/input/event1name: "rk8xx_pwrkey"
add device 6: /dev/input/event0name: "ff420030.pwm"/dev/input/event2: 0001 0073 00000001
/dev/input/event2: 0000 0000 00000000
/dev/input/event2: 0001 0073 00000000
/dev/input/event2: 0000 0000 00000000
其中0073即为上报的键值,转换为十进制是115,其中输入设备为
/dev/input/event2 name: “adc-keys”
- 查看次输入设备所对应的键值kl,使用dumpsys input
130|rk3399pro:/ $ dumpsys input
INPUT MANAGER (dumpsys input)Input Manager State:Interactive: trueSystem UI Visibility: 0x8708Pointer Speed: 0Pointer Gestures Enabled: trueShow Touches: falsePointer Capture Enabled: falseEvent Hub State:.....1: adc-keysClasses: 0x00004001Path: /dev/input/event2Enabled: trueDescriptor: 485d69228e24f5e46da1598745890b214130dbc4Location: adc-keys/input0ControllerNumber: 0UniqueId: Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100KeyLayoutFile: /system/usr/keylayout/Generic.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile: HaveKeyboardLayoutOverlay: false
由上可知道对应的kl文件为 /system/usr/keylayout/Generic.kl.
- 修改键值映射:
挂载system为可读,打开/system/usr/keylayout/Generic.kl文件,发现115的键值已经被映射为音量加
key 115 VOLUME_UP
我们这里把他修改为静音,保存后重启测试修改有效
key 115 VOLUME_MUTE
注:支持的映射键值定义在
frameworks/native/include/android/keycodes.h
或 frameworks/native/include/input/InputEventLabels.h 中的KEYCODES[] = {}
2.添加新设备kl
以上面的为例,
/dev/input/event2 name: “adc-keys”
KeyLayoutFile: /system/usr/keylayout/Generic.kl
映射键值由 VOLUME_UP -> VOLUME_MUTE
输入设备adc-keys对应的键值为Generic.kl.如果修改了Generic.kl下的键值映射,那么对所有的输入设备都有效.如果我想只有输入设备adc-keys有效,那么我们要建立对应的kl文件即可.
1. 设备kl命名规则1:以设备名命名
设备kl的命名规则是:设备名称中除"0-9"、“a-z”、“A-Z”、"-“或”_“之外的所有字符将替换为”_"
以下输入设备为例
add device 1: /dev/input/event2
name: “adc-keys”
add device 2: /dev/input/event4
name: “Wireless Dongle Wireless Dongle”
add device 6: /dev/input/event0
name: “ff420030.pwm”
对应的设备kl名称分别为:
adc-keys.kl
Wireless_Dongle_Wireless_Dongle.kl
ff420030_pwm.kl
按照此规则,我们添加adc-keys.kl并进行键值映射
新建 system/usr/keylayout/adc-keys.kl
编辑添加 key 115 VOLUME_MUTE
保存重启
重新使用dumpsys input查看
system/usr/keylayout/adc-keys.kl
key 115 VOLUME_MUTE1: adc-keysClasses: 0x00004001Path: /dev/input/event2Enabled: trueDescriptor: 485d69228e24f5e46da1598745890b214130dbc4Location: adc-keys/input0ControllerNumber: 0UniqueId: Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100KeyLayoutFile: /system/usr/keylayout/adc-keys.klKeyCharacterMapFile: /system/usr/keychars/Generic.kcmConfigurationFile: HaveKeyboardLayoutOverlay: false
会发现adc-keys 对应的KeyLayoutFile已经改为 /system/usr/keylayout/adc-keys.kl
2. 设备kl命名规则2:以设备的vid,pid,version命名(version为可选)
设备的kl名除了以设备名转换得来以外,还可以使用设备的Vid,Pid来生成
Vendor_xxx_Product_xxxx.kl
如果当同样的vid,pid时,不同Version也要使用不同的kl映射
Vendor_xxx_Product_xxx_Version_xxx.kl
以 adc-keys为例,之前使用dumpsys input获得了如下信息
1: adc-keys
Classes: 0x00004001
Path: /dev/input/event2
Enabled: true
Descriptor: 485d69228e24f5e46da1598745890b214130dbc4
Location: adc-keys/input0
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0019, vendor=0x0001, product=0x0001, version=0x0100
KeyLayoutFile: /system/usr/keylayout/Generic.kl
KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: false
adc-keys的vendor=0x0001, product=0x0001, version=0x0100
那么他对应的kl名是:
Vendor_0001_Product_0001.kl
Vendor_0001_Product_0001_Version_0100.kl(包含Version区分)
测试的部分和之前设备kl命名规则1相同就不重复了.
3.新增自定义键值并进行键值映射
现在的键值映射都是映射系统内已经定义的按键,那么如果我想新增一个功能键要如何实现?
定义一个键值涉及的文件是:
frameworks/base/core/java/android/view/KeyEvent.java
frameworks/native/include/android/keycodes.h
frameworks/native/include/input/InputEventLabels.h
以新增键值KeyEvent.KEYCODE_NFC为例子:
diff --git a/frameworks/base/core/java/android/view/KeyEvent.java b/frameworks/base/core/java/android/view/KeyEvent.java
index caccc04..86d9eff 100755
--- a/frameworks/base/core/java/android/view/KeyEvent.java
+++ b/frameworks/base/core/java/android/view/KeyEvent.java
@@ -835,7 +835,9 @@ public class KeyEvent extends InputEvent implements Parcelable {public static final int KEYCODE_RADAR_IN = 305;public static final int KEYCODE_RADAR_OUT = 306;- private static final int LAST_KEYCODE = KEYCODE_RADAR_OUT;
+ public static final int KEYCODE_NFC = 307;
+
+ private static final int LAST_KEYCODE = KEYCODE_NFC;// NOTE: If you add a new keycode here you must also add it to:// isSystem()
diff --git a/frameworks/native/include/android/keycodes.h b/frameworks/native/include/android/keycodes.h
index 401d3ad..46242f6 100644
--- a/frameworks/native/include/android/keycodes.h
+++ b/frameworks/native/include/android/keycodes.h
@@ -777,7 +777,8 @@ enum {AKEYCODE_MICMUTE = 312,AKEYCODE_RADAR_IN = 305,
- AKEYCODE_RADAR_OUT = 306
+ AKEYCODE_RADAR_OUT = 306,
+ AKEYCODE_NFC = 307// NOTE: If you add a new keycode here you must also add it to several other files.// Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
diff --git a/frameworks/native/include/input/InputEventLabels.h b/frameworks/native/include/input/InputEventLabels.h
index adab438..50794ae 100644
--- a/frameworks/native/include/input/InputEventLabels.h
+++ b/frameworks/native/include/input/InputEventLabels.h
@@ -305,6 +305,7 @@ static const InputEventLabel KEYCODES[] = {DEFINE_KEYCODE(TV_KEYMOUSE_MODE_SWITCH),DEFINE_KEYCODE(RADAR_IN),DEFINE_KEYCODE(RADAR_OUT),
+ DEFINE_KEYCODE(NFC),DEFINE_KEYCODE(HELP),DEFINE_KEYCODE(NAVIGATE_PREVIOUS),DEFINE_KEYCODE(NAVIGATE_NEXT),
最后把他映射给adc-keys的按键
打开 system/usr/keylayout/adc-keys.kl
将key 115 VOLUME_MUTE 修改为key 115 NFC
保存重启
4. 使映射的按键为唤醒按键
除了电源键外,系统内还定义了一些按键做唤醒键,当机器休眠时按下可以唤醒机器,如果想要我们映射的按键也可以唤醒屏幕的话,只需要在kl文件中做如下修改:
key 115 VOLUME_MUTE WAKE_DROPPED
#key 115 VOLUME_MUTE WAKE
WAKE: 当设备睡眠时按下此键,设备将被唤醒,按键事件将会被发送到应用程序.
WAKE_DROPPED: 当设备睡眠时按下此键,设备将被唤醒,而按键事件不会被发送到应用程序.
5. 验证按键映射工具
Android 框架有一个名为 validatekeymaps 的小工具,用于验证输入设备配置文件、按键布局文件、按键字符映射文件和虚拟按键定义文件的语法。
编译
mmm frameworks/base/tools/validatekeymaps
该命令应该会将一个名为 validatekeymaps 的主机工具编译到 out/host//bin 目录中。
使用
如果您通过运行 envsetup.sh 设置了开发环境,那么 validatekeymaps 工具应当已经位于您的路径中。您可以通过运行 validatekeymaps 进行验证。
android10.0$ validatekeymaps
Usage:
validatekeymaps [-q] [.kl] [.kcm] [.idc] [virtualkeys.] […]
Validates the specified key layouts, key character maps,
input device configurations, or virtual key definitions.
-q Quiet; do not write anything to standard out.
示例:
android10.0$ validatekeymaps frameworks/base/data/keyboards/Generic.kl
Validating file ‘frameworks/base/data/keyboards/Generic.kl’…
No errors.
Success.
编辑Generic.kl添加一个不存在的键值1_XX,再次测试
android10.0$ vim frameworks/base/data/keyboards/Generic.kl
sjf@firefly-B360-HD3:~/project/3328/android10.0$ validatekeymaps frameworks/base/data/keyboards/Generic.kl
Validating file ‘frameworks/base/data/keyboards/Generic.kl’…
E/KeyLayoutMap(20647): frameworks/base/data/keyboards/Generic.kl:24: Expected key code label, got ‘1_XX’.
Error -22 parsing key layout file.
Failed!
6.相关问题
[RK3399][Android7.1.1] keylayout键值映射:添加了自定义kl档,但仍调用默认Generic.kl的问题
Android 键值映射相关推荐
- linux+android4.2键值关系,Android4.0 添加一个新的Android 键值
这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Browser(这个键 ...
- Android4.0 添加一个新的Android 键值
这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为Android所需要的数值: 以添加一个Linux键值为217,把它映射为android的键值Brow ...
- 【快乐水题】677. 键值映射
原题: 力扣链接:677. 键值映射 题目简述: 实现一个 MapSum 类,支持两个方法,insert 和 sum: MapSum() 初始化 MapSum 对象 void insert(Strin ...
- 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换
MyTrie结构体和相关操作函数 typedef struct MyTrie {bool is_word;vector<MyTrie*> next;MyTrie():is_word(fal ...
- Unity中的输入事件总结与数字电视遥控器键值映射
版权声明:欢迎批评指正,转载请务必注明原文链接:欢迎文章下公开讨论. https://blog.csdn.net/cordova/article/details/51036547 一.Unity的基本 ...
- 键盘动态库开发(修改键值映射和键盘灯控制)
键盘动态库开发(修改键值映射和键盘灯控制) 开发需求 键盘DLL功能 1. 键盘OPEN 2. 键盘CLOSE 3. 键盘灯控制 4. 键值抓取 开发需求 需求:开发一款9键键盘DLL和演示程序,要求 ...
- linux的自定义input,linux键值到Android键值的转换与自定义
首先要确定按键输入设备是对应/dev/input目录下哪个event,根据VID PID匹配对应的kl文件,可通过如下命令 cat /proc/bus/input/devices 查看设备信息 fra ...
- 安卓按键键值映射关系
1.vendor或者device 目录或者framework下有一些.kl文件定义键值 2.kl文件命名为规则为Vendor_2717_Product_32b0.kl 其中2717 和32b0可以通过 ...
- android键值列表,Android Json不规则键值解析与转换
简述 在Android开发的时候,通过网络请求获取后台返回数据与上传数据给后台是十分常见的.有时候,我们会遇到需要解析和传递特殊键值的Json,对于这种情况,引出了本次要讲诉的内容. Json数据解析 ...
- LeetCode677. 键值映射(Trie树)
1. 题目 实现一个 MapSum 类里的两个方法,insert 和 sum. 对于方法 insert,你将得到一对(字符串,整数)的键值对.字符串表示键,整数表示值.如果键已经存在,那么原来的键值对 ...
最新文章
- Python 操作 MySQL 数据库
- MySQL和PostgreSQL的常用语法差异
- codevs2171 棋盘覆盖
- Java LocalDate类| 带示例的compareTo()方法
- gettype获取类名_在TypeScript中运行时获取对象的类名
- window 写txt 换行
- mkv210_image.c详解
- 深入浅出VMware的组网模式
- 考研高等数学张宇30讲笔记——第十一讲 多元函数微分学
- CentOS 7 配置花生壳(phddns)自启动
- http://www.techpot.net/archives/38147
- 游戏服务器背包设计与开发
- 关于Qt的无边框窗口移动
- html把横转为竖,爱剪辑将横屏视频转为竖屏教程 爱剪辑视频怎么横竖屏转换
- vue+Element表单验证+数字英文密码和手机号验证(详细)
- Java实现JWS生成与验签
- 中国传媒大学计算机课程表,课 程 表 - 中国传媒大学
- 蜂鸟量化开创全新量化交易
- Pr动态图形模板Mogrt导入失败 Mogrt is Corrupt 解决方法 Motion Graphics Templates is corrupt.
- 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式
热门文章
- 金山WPS c++ 一面面经
- MATLAB 的 colormap 函数详解
- 如果这篇文章说不清epoll的本质,那就过来掐死我吧! (3)
- 计算机设备管理器更新驱动器,怎么利用设备管理器更新显卡驱动 - 驱动管家
- COOC+VOSviewer可取代任何文献计量与知识图谱软件
- torch代码解析 为什么要使用optimizer.zero_grad()
- python里offset啥意思_深度理解Jquery 中 offset() 方法
- text-stroke实现文字描边(镂空)、text-fill-color实现文字填充渐变(+animation实现流光字体)...
- 小工程结算书范本_工程结算书范本.doc
- Convex Optimization 读书笔记 (1)