Android 键值映射

1.修改按键的键值映射

  1. 修改键值映射,首先要获取到上报的按键键值,使用getevent来获取
rk3399pro:/ $ getevent
add device 1: /dev/input/event2
  name:     "adc-keys"
add device 2: /dev/input/event4
  name:     "Wireless Dongle Wireless Dongle"
add device 3: /dev/input/event5
  name:     "Wireless Dongle Wireless Dongle"
add device 4: /dev/input/event3
  name:     "rockchip,rk809-codec Headphone Jack"
add device 5: /dev/input/event1
  name:     "rk8xx_pwrkey"
add device 6: /dev/input/event0
  name:     "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: true
  System UI Visibility: 0x8708
  Pointer Speed: 0
  Pointer Gestures Enabled: true
  Show Touches: false
  Pointer Capture Enabled: false

Event Hub State:

 .....

    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

由上可知道对应的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_MUTE
    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/adc-keys.kl
      KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
      ConfigurationFile: 
      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的问题

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值