• 1.修改按键的键值映射
  • 2.添加新设备kl
    • 1. 设备kl命名规则1:以设备名命名
    • 2. 设备kl命名规则2:以设备的vid,pid,version命名(version为可选)
  • 3.新增自定义键值并进行键值映射
  • 4. 使映射的按键为唤醒按键
  • 5. 验证按键映射工具
      • 编译
    • 使用
  • 6.相关问题

1.修改按键的键值映射

  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”

  1. 查看次输入设备所对应的键值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.

  1. 修改键值映射:
    挂载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 键值映射相关推荐

  1. linux+android4.2键值关系,Android4.0 添加一个新的Android 键值

    这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Browser(这个键 ...

  2. Android4.0 添加一个新的Android 键值

    这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为Android所需要的数值: 以添加一个Linux键值为217,把它映射为android的键值Brow ...

  3. 【快乐水题】677. 键值映射

    原题: 力扣链接:677. 键值映射 题目简述: 实现一个 MapSum 类,支持两个方法,insert 和 sum: MapSum() 初始化 MapSum 对象 void insert(Strin ...

  4. 字典树/Trie/前缀树-LeetCode总结:720词典中最长的单词;127. 单词接龙;677. 键值映射;面试题 17.17. 多次搜索;648. 单词替换

    MyTrie结构体和相关操作函数 typedef struct MyTrie {bool is_word;vector<MyTrie*> next;MyTrie():is_word(fal ...

  5. Unity中的输入事件总结与数字电视遥控器键值映射

    版权声明:欢迎批评指正,转载请务必注明原文链接:欢迎文章下公开讨论. https://blog.csdn.net/cordova/article/details/51036547 一.Unity的基本 ...

  6. 键盘动态库开发(修改键值映射和键盘灯控制)

    键盘动态库开发(修改键值映射和键盘灯控制) 开发需求 键盘DLL功能 1. 键盘OPEN 2. 键盘CLOSE 3. 键盘灯控制 4. 键值抓取 开发需求 需求:开发一款9键键盘DLL和演示程序,要求 ...

  7. linux的自定义input,linux键值到Android键值的转换与自定义

    首先要确定按键输入设备是对应/dev/input目录下哪个event,根据VID PID匹配对应的kl文件,可通过如下命令 cat /proc/bus/input/devices 查看设备信息 fra ...

  8. 安卓按键键值映射关系

    1.vendor或者device 目录或者framework下有一些.kl文件定义键值 2.kl文件命名为规则为Vendor_2717_Product_32b0.kl 其中2717 和32b0可以通过 ...

  9. android键值列表,Android Json不规则键值解析与转换

    简述 在Android开发的时候,通过网络请求获取后台返回数据与上传数据给后台是十分常见的.有时候,我们会遇到需要解析和传递特殊键值的Json,对于这种情况,引出了本次要讲诉的内容. Json数据解析 ...

  10. LeetCode677. 键值映射(Trie树)

    1. 题目 实现一个 MapSum 类里的两个方法,insert 和 sum. 对于方法 insert,你将得到一对(字符串,整数)的键值对.字符串表示键,整数表示值.如果键已经存在,那么原来的键值对 ...

最新文章

  1. Python 操作 MySQL 数据库
  2. MySQL和PostgreSQL的常用语法差异
  3. codevs2171 棋盘覆盖
  4. Java LocalDate类| 带示例的compareTo()方法
  5. gettype获取类名_在TypeScript中运行时获取对象的类名
  6. window 写txt 换行
  7. mkv210_image.c详解
  8. 深入浅出VMware的组网模式
  9. 考研高等数学张宇30讲笔记——第十一讲 多元函数微分学
  10. CentOS 7 配置花生壳(phddns)自启动
  11. http://www.techpot.net/archives/38147
  12. 游戏服务器背包设计与开发
  13. 关于Qt的无边框窗口移动
  14. html把横转为竖,爱剪辑将横屏视频转为竖屏教程 爱剪辑视频怎么横竖屏转换
  15. vue+Element表单验证+数字英文密码和手机号验证(详细)
  16. Java实现JWS生成与验签
  17. 中国传媒大学计算机课程表,课 程 表 - 中国传媒大学
  18. 蜂鸟量化开创全新量化交易
  19. Pr动态图形模板Mogrt导入失败 Mogrt is Corrupt 解决方法 Motion Graphics Templates is corrupt.
  20. 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式

热门文章

  1. 金山WPS c++ 一面面经
  2. MATLAB 的 colormap 函数详解
  3. 如果这篇文章说不清epoll的本质,那就过来掐死我吧! (3)
  4. 计算机设备管理器更新驱动器,怎么利用设备管理器更新显卡驱动 - 驱动管家
  5. COOC+VOSviewer可取代任何文献计量与知识图谱软件
  6. torch代码解析 为什么要使用optimizer.zero_grad()
  7. python里offset啥意思_深度理解Jquery 中 offset() 方法
  8. text-stroke实现文字描边(镂空)、text-fill-color实现文字填充渐变(+animation实现流光字体)...
  9. 小工程结算书范本_工程结算书范本.doc
  10. Convex Optimization 读书笔记 (1)