Android添加新键值实现
1. 为了方便调试,我打开了debug选项,将
KeyInputQueue.java,
WindowManagerService.java
PhoneWindowManager.java
的debug选项修改为true,最好把修改的地方注上名字,等调试完成后将其复原。
2. 在.kl文件中定义键值:idh.code\3rdparty\products\sp8805ga\sprd-keypad8805ga.kl
key 185   IM
注意:新加的键值不要与已有的重复。
3. 在键盘驱动中定义相应的键盘扫描码:kernel\drivers\input\keyboard\sc8800g-keys.c
static const unsigned int sprd_keymap[] = {
...
KEYVAL(5, 0, KEY_F15),//IM
...
}
4. 在数组keycodes 中添加 新定义的信息:frameworks/base/include/ui/KeycodeLabels.h
static const KeycodeLabel KEYCODES[] = {
...
{ "IM", 92 },
// NOTE: If you add a new keycode here you must also add it to:
//   (enum KeyCode, in this file)
//   frameworks/base/core/java/android/view/KeyEvent.java
//   tools/puppet_master/PuppetMaster.nav_keys.py
//   frameworks/base/core/res/res/values/attrs.xml


{ NULL, 0 }
}
注意:要在{NULL, 0}之前添加

static const KeycodeLabel KEYCODES[] = {
...
kKeyCodeIM = 92
}
5. frameworks/base/core/res/res/values/attrs.xml

...

   
6. frameworks/base/core/java/android/view/KeyEvent.java
public class KeyEvent implements Parcelable {
...
public static final int KEYCODE_IM = 92;
// NOTE: If you add a new keycode here you must also add it to:
//  isSystem()
//  frameworks/base/include/ui/KeycodeLabels.h
//  tools/puppet_master/PuppetMaster/nav_keys.py
//  frameworks/base/core/res/res/values/attrs.xml
//  commands/monkey/Monkey.java
//  emulator?
//
//  Also Android currently does not reserve code ranges for vendor-
//  specific key codes.  If you have new key codes to have, you
//  MUST contribute a patch to the open source project to define
//  those new codes.  This is intended to maintain a consistent
//  set of key code definitions across all Android devices.
  
private static final int LAST_KEYCODE           = KEYCODE_IM;
}

public final boolean isSystem() {
//如果是系统按键

case KEYCODE_IM:
            return true;
}
7. 新键值进行处理:frameworks/policies/base/phone/com/android/internal/policy/impl/PhoneWindowManager.java
public boolean interceptKeyTi(WindowState win, int code, int metaKeys, boolean down, 
            int repeatCount, int flags) {
...
// First we always handle the home key here, so applications
        // can never break it, although if keyguard is on, we do let
        // it handle it, because that gives us the correct 5 second
        // timeout.
        if (code == KeyEvent.KEYCODE_HOME) {
...
} else if (code == KeyEvent.KEYCODE_MENU) {
...
} else if (code == KeyEvent.KEYCODE_IM) {
TODO: do something
}
}

注意:
1. 在.kl文件中,是按行读的,所以如果不能找到对应键值,则抛出异常,导致后面的键值不能正确读出
如果.kl文件中存在“key 184   ADDRESSBOOK”,但是其他地方未实现,则会抛出下面异常
E/KeyLayoutMap( 1149): /system/usr/keylayout/sprd-keypad8805ga.kl:156: expected keycode, got 'ADDRESSBOOK'
2. 在.kl文件中,是区别大小写的,所以如果没注意添加了Key 184   ADDRESSBOO 或KEY 185   IM
则会导致报以下错误,并使Event不能正确映射。
E/KeyLayoutMap( 1207): /system/usr/keylayout/sprd-keypad8805ga.kl:159: expected flag, got 'KEY'

更多相关文章

  1. Android(安卓)Studio同一工程生成不同的app名,包名,图标分别设置
  2. android 文件操作方法集合类分享
  3. FileOutputStream中的 3种write方式
  4. Android工程中怎样使用隐藏API
  5. android 5 设置图案锁,锁屏界面进入相机拍照、查看锁定的照片后,退
  6. 「React Native」Android(安卓)title 标题不居中问题
  7. Android(安卓)studio中导出jar包
  8. Android重写View并且自定义属性(二)
  9. ubuntu16.04 + Qt5.13 搭建安卓开发环境

随机推荐

  1. Android和Linux关系
  2. Android CTS 兼容性测试
  3. Android 核心分析 之五 -----基本空间划
  4. Android位图总结
  5. 【Android Studio使用教程3】Android Stu
  6. Android(安卓)之 MediaPlayer类
  7. Android dumpsys input详解
  8. Android中LayoutParams总结和用法
  9. Android libv4l2-android 摄像头视频捕获
  10. 新书《Android/OPhone开发完全讲义》即将