Android按键识别及映射过程(2)

Android输入事件设备,用的是中断(硬件触发)或者轮询结构(软件模拟),捕获设备具体的扫描码,通过input_event()转化成标准的内核可接受的事件。
  键映射驱动的其他主要驱动是建立一个probe函数,用于注册中断或者您的软件模拟的轮询功能函数,硬件初始化,用input_register_device()注册驱动/设备到输入输出系统。
  注:关于probe属于linux设备驱动模型相关知识,可以阅读LDD3或者LINUX设备驱动原理与实践,有很详细的描述。

下面表描述了从键盘输入最终转成相应应用行为的转化步骤

步骤                            行为                                                解释
1                    窗口管理器从Linux键盘驱动获取键盘事件                             按键消息不指定任何逻辑事件,它只与其硬件位置有关, 也就是说,按键的键盘码没有任何软件含义,映射键盘码
2                    窗口管理器映射扫描码为键码。                                    当窗口管理器从驱动读到一个键,它利用那个键布局映射文件将扫描码映射为键值。特别的,这个键值就是屏幕显示的条码。例如
                                                                            KEYCODE_DPAD_CENTER是导航五位键的中间的键,即使ALT+G产生一个"?"字符,事实上KEYCODE_G就是这个键值。

3                           窗口管理器发送扫描码和键码到应用程序`                            扫描码和键码被当前焦点所在界面处理,具体"翻译"要看具体的应用场合。  

键布局映射

如何选择一个键布局映射文件
键布局映射文件通常放在/system/usr/keylayout和/data/usr/keylayout

对于每一个键盘设备xxx,设置系统属性android.keylayout.xxx,如果没有为自己的硬件设备创建一个特定的设备,Android将去读/system/usr/keylayout/qwerty.kl这个配置文件。

注:如果设置系统属性,请查看ttp://www.kandroid.org/android_pdk/build_new_device.html


 

Android键盘的默认配置路径是sdk/emulator/keymaps

有两个最重要的文件:

qwerty.kl 默认的KeyLayout文件,是映射键盘物理矩阵的ScanCode到系统的KeyCode的一个关系。这个需要我们事先知道我们的键盘矩阵值。如果厂家不提供,就自己一个一个Log打印。

这个文件的格式,很多网络的资料都提供,可以了解下。下面只简单的说明

key 158   BACK                   WAKE_DROPPED
key 230   SOFT_RIGHT        WAKE

第一列Key 表示一行有效的开始,注释行用#开头

第二列表示Scancode ,是键盘物理设备的矩阵扫描码值

第三列表示系统里面的按键码Keycode,这样物理键盘和操作系统就对应起来了。

第四列表示KeyCode的Flag信息,可有可无,一般有三种状态

空                               没有附加信息

WAKE                         当机器处理Sleep状态,可以唤醒,按键信息继续被处理

WAKE_DROPPED        当机器处于Sleep状态,可以唤醒,但是丢弃按键信息

这里是一一映射的关系。需要根据键盘的不同来处理。

如果是正规的做法,ScanCode对应键盘值在不同的国家键盘中时不会变的,例如常用的US键盘。但是有时没有UK的矩阵,只能用US的,

这个时候就需要我们软件去更改这个ScanCode和KeyCode的映射关系。严重不推荐这种非标准化做法。


文件格式:
键映射文件通常以UTF8文本文件格式存储于设备,通常有如下特性:
注释:用#表示,以#开头的内容都将被忽略。
空白:所有的空行被忽略
键定义:键定义遵循如下格式key SCANCODE KEYCODE [FLAGS...],当扫描码是一个数字,键码定义在你描述的布局文件android.keylayout.xxx,另外可以设置相关的FLAGS:
SHIFT: 当按下,自动加上SHIFT键值
ALT:当按下,自动加上ALT
CAPS:当按下,自动带上CAPS大写
WAKE:当按下,当设备进入睡眠的时候,按下这个键将唤醒,而且发送消息给应用层。
WAKE_DROPPED:当按下,且设备正处于睡眠,设备被唤醒,但是不发送消息给应用层。

键盘映射文件示例:
android/src/device/product/generic/tuttle2.kl
# Copyright 2007 The Android Open Source Project

key 2     1
key 3     2
key 4     3
key 5     4
key 6     5
key 7     6
key 8     7
key 9     8
key 10    9
key 11    0
key 158   BACK              WAKE_DROPPED
key 230   SOFT_RIGHT        WAKE
key 60    SOFT_RIGHT        WAKE
key 107   ENDCALL           WAKE_DROPPED
key 62    ENDCALL           WAKE_DROPPED
key 229   MENU         WAKE_DROPPED
key 59    MENU         WAKE_DROPPED
key 228   POUND
key 227   STAR
key 231   CALL              WAKE_DROPPED
key 61    CALL              WAKE_DROPPED
key 232   DPAD_CENTER       WAKE_DROPPED
key 108   DPAD_DOWN         WAKE_DROPPED
key 103   DPAD_UP           WAKE_DROPPED
key 102   HOME              WAKE
key 105   DPAD_LEFT         WAKE_DROPPED
key 106   DPAD_RIGHT        WAKE_DROPPED
key 115   VOLUME_UP
key 114   VOLUME_DOWN
key 116   POWER             WAKE
key 212   SLASH

key 16    Q
key 17    W
key 18    E
key 19    R
key 20    T
key 21    Y
key 22    U
key 23    I
key 24    O
key 25    P

key 30    A
key 31    S
key 32    D
key 33    F
key 34    G
key 35    H
key 36    J
key 37    K
key 38    L
key 14    DEL
       
key 44    Z
key 45    X
key 46    C
key 47    V
key 48    B
key 49    N
key 50    M
key 51    COMMA
key 52    PERIOD
key 28    ENTER
       
key 56    ALT_LEFT
key 42    SHIFT_LEFT
key 215   AT
key 57    SPACE
key 53    SLASH
key 127   SYM
key 100   ALT_LEFT

key 399   GRAVE
键字符映射:
键字符映射位于:/system/usr/keychars和/data/usr/keychars!
比如对于一个特定的设备xxx,设置android.keychar.xxx系统属性,用全路径表示去描述所需的键字符映射。如果你没有描述任何一个键字符映射,系统将默认使用/system/usr/keychar/qwerty.kl!
注:这一点可以在开发板接USB KEYBOARD的时候,将logcat打开看调试信息,会看到default to qwerty.kl类似的信息。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/1fef765ad2729861f5a61631ee19ac1a.html