Android中添加USB键盘的CapsLock键

来源:互联网 发布:淘宝网户外家具 编辑:程序博客网 时间:2024/06/06 03:52

转自:   http://blog.csdn.net/joard_yang/article/details/7191313


      Android平板的硬件越来越强大屏幕越来越大,大家希望按照使用PC的习惯来使用它,如果要在平板上进行大量的文字输入使用虚拟按键简直就是折磨自己,USB键盘才是正常的输入设备,下面的文章记录了调试键盘中对CapsLock按键添加的过程。

      国际标准USB键盘的所有的按键在linux中已经有键值了在文件external/qemu/linux_keycodes.h,比如capslock没有功能只因为按键没有报到上层和中间层,在android_text_KeyCharacterMap.cpp的get函数中加log打印出Keycode会发现CapsLock的Keycode是0,现在首要是让Keycode报上来,以下的内容兼顾2.2和2.3

1.由于Android是基于Linux内核的,external/qemu/linux_keycodes.h文件中查到CapsLock按键的扫描码的值58

2.frameworks/base/core/java/android/view/KeyEvent.java
添加按键最起码,要涉及到三个文件:KeyEvent.java、qwerty.kl、qwerty.kcm,由于,
KeyEvent.java中描述所以放在开始来写。注意“NOTE”部分的描述

  public static final int KEYCODE_CAPS_LOCK = 115;
    // NOTE: If you add a new keycode here you must also add it to:
    //  isSystem()
    //  frameworks/base/include/ui/KeycodeLabels.h
    //  frameworks/base/core/res/res/values/attrs.xml

以上是2.2的2.3的有些不同
    //  isSystem()
    //  native/include/android/keycodes.h
    //  frameworks/base/include/ui/KeycodeLabels.h
    //  external/webkit/WebKit/android/plugins/ANPKeyCodes.h
    //  frameworks/base/core/res/res/values/attrs.xml

NOTE所涉及的文件要把我们的键值添加进去
  public final boolean isSystem() {
....
case KEYCODE_CAPS_LOCK:
....
}
这里2.2和2.3有一点不一样,2.3中的isSystem改在了
frameworks/base/libs/ui/input.cpp中

3.在frameworks/base/include/ui/KeycodeLabels.h中添加
static const KeycodeLabel KEYCODES[] = {
...
 {"CAPS_LOCK",115},
...
}

typedef enum KeyCode {
...
    kKeyCapsLock  = 115
...
} KeyCode;(2.3里没有这一部分,类似的内容在frameworks\base\native\include\android\Keycodes.h的数组中)

4.在frameworks/base/core/res/res/values/attrs.xml中添加
 <attr name="keycode">
...
 <enum name="KEYCODE_CAPS_LOCK" value="115" />
    </attr>
...

5.external\qemu\android\Keycode.h
/* Keep it consistent with linux/input.h */
typedef enum {
...
    kKeyCapsLock                 = KEY_CAPSLOCK,
...

} AndroidKeyCode;

6.external\webkit\webcore\platform\android\KeyEventAndroid.cpp
// compare to same function in gdk/KeyEventGdk.cpp
static int windowsKeyCodeForKeyEvent(unsigned int keyCode)
{
    // Does not provide all key codes, and does not handle all keys.
    switch (keyCode) {
...
    case kKeyCapsLock:
        return 0x14;
    default:
        return 0;
    }
}

7.external\webkit\webkit\android\plugins\ANPKeyCodes.h
enum ANPKeyCodes {
...
    kCapsLock_ANPKeyCode = 115
};

8.sdk\emulator\keymaps\qwerty.kl
key 58    CAPS_LOCK  

添加后android_text_KeyCharacterMap.cpp中的log会有115的Keycode报出。下面就是将大写锁定的功能实现,这也简单在MetaKeyKeyListener.java (frameworks\base\core\java\android\text\method)  的onkeyup方法中添加

 if(keyCode == KeyEvent.KEYCODE_CAPS_LOCK){
         if(!isCapsLockPress){
          press(content, CAP);
        }else{
         press(content, CAP);
         release(content, CAP);
        }
        isCapsLockPress = !isCapsLockPress;
        return true;
       } 

isCapsLockPress是一个全局变量控制大写锁定,以上一定要添加的onkeyup中,一开始我放在onkeydown中发现CapsLock的状态会乱(LED灯和大小写的状态不一致),原因是按下按键后onkeydown执行的次数不一定会造成isCapsLockPress的值混乱,而onkeyup只会执行一次。

0 0
原创粉丝点击