android添加按键(二)
2015-11-19 11:47
706 查看
Android 系统对加载键盘布局文件(Generic.kl ).
在 开发板的文件目录 /system/usr/idc 中有一系列的 *.idc 框架层会根据驱动中的配置,自动生成设备的idc 文件。
例如在 EventHub.cpp 中的 loadConfigurationLocked 方法中,会获取设备的idc 文件。如果没有获取到idc 文件,那么会采用默认的Generic.kl .
在EventHub.cpp 中的 openDeviceLocked方法中会 loadConfigurationLocked,一般而言根据,/dev/input 中的event0,envent1等。会多次调用 openDeviceLocked
如果找到 idc 文件,根据idc 文件获得对应的kl文件和kcm 文件的名称。
1.kl文件添加按键码映射,251,252 是 驱动上报上来的键值
key 251 DECT_REGISTER
key 252 DECT_PHONE
2.frameworks/base/include/androidfw/KeycodeLabels.h
对KEYCODES,添加按键码
static const KeycodeLabel KEYCODES[] = {
...
{ "DECT_REGISTER",220},
{ "DECT_PHONE",221},
3.frameworks/base/core/res/res/values/attr.xml
<enum name="KEYCODE_DECT_REGISTER" value="220"/>
<enum name="KEYCODE_DECT_PHONE" value="221"/>
4.frameworks/native/include/android/keycode.h
enum {
AKEYCODE_UNKNOWN = 0,
....
....
添加
AKEYCODE_DECT_REGISTER =220,
AKEYCODE_DECT_PHONE =221,
5.frameworks/base/core/java/android/view/KeyEvent.java
添加
public static final int KEYCODE_DECT_REGISTER= 220;
public static final int KEYCODE_DECT_PHONE=221;
修改 LAST_KEYCODE 和 KEYCODE_SYMBOLIC_NAMES
private static final int LAST_KEYCODE = KEYCODE_DECT_REGISTER;
// NOTE: If you add a new keycode here you must also add it to:
// 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
// emulator?
// LAST_KEYCODE
// KEYCODE_SYMBOLIC_NAMES
private static void populateKeycodeSymbolicNames() {
SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;
names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");
...
...
names.append(KEYCODE_DECT_REGISTER, "KEYCODE_DECT_REGISTER");
names.append(KEYCODE_DECT_PHONE, "KEYCODE_DECT_PHONE");
}
修改 isSystem(),追踪jni需要修改frameworks/base/lib/androidrw/input.cpp KeyEvent::isSystemKey
bool KeyEvent::isSystemKey(int32_t keyCode) {
switch (keyCode) {
....
case AKEYCODE_DECT_REGISTER:
case AKEYCODE_DECT_PHONE:
return true;
}
return false;
}
6.external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
修改
enum ANPKeyCodes {
kUnknown_ANPKeyCode = 0,
...
...
kDectRegister_ANPKeyCode=220,
kDectPhone_ANPKeyCode=221,
}
以上修改完成后,可以在PhoneWindowManager 测试下这个两个键是否成功上报,如果上报成功,就可以在自己的应用中添加与这个按键相关的逻辑处理。
<1>确保驱动上报键值的准确性。
<1>确保确定设备的kl文件。根据 /system/usr/idc 中的idc 文件,以及 在EventHub.cpp中打印 设备的配置 文件,确定设备的kl 文件,设备不止一个kl文件
<3> kl 文件的键值映射正确。
key 123 KEYCODENAME, KEYCODENAME 与驱动没有关系,必须保证这个 keycode 被添加成功。在KeyEvent.java 中的注释中已经说明了用户添加一个新的按键所需要修改的所有文件。
<4> 框架层修改完成后,为了确保正确,将ap侧代码全部编译一遍,重新烧录system.img.在PhoneWindowManager 中验证按键是否正常。
Android 系统对加载键盘布局文件(Generic.kl ).
在 开发板的文件目录 /system/usr/idc 中有一系列的 *.idc 框架层会根据驱动中的配置,自动生成设备的idc 文件。
例如在 EventHub.cpp 中的 loadConfigurationLocked 方法中,会获取设备的idc 文件。如果没有获取到idc 文件,那么会采用默认的Generic.kl .
在EventHub.cpp 中的 openDeviceLocked方法中会 loadConfigurationLocked,一般而言根据,/dev/input 中的event0,envent1等。会多次调用 openDeviceLocked
如果找到 idc 文件,根据idc 文件获得对应的kl文件和kcm 文件的名称。
添加步骤
添加新的物理按键 DECT_REGISTER, DECT_PHONE1.kl文件添加按键码映射,251,252 是 驱动上报上来的键值
key 251 DECT_REGISTER
key 252 DECT_PHONE
2.frameworks/base/include/androidfw/KeycodeLabels.h
对KEYCODES,添加按键码
static const KeycodeLabel KEYCODES[] = {
...
{ "DECT_REGISTER",220},
{ "DECT_PHONE",221},
3.frameworks/base/core/res/res/values/attr.xml
<enum name="KEYCODE_DECT_REGISTER" value="220"/>
<enum name="KEYCODE_DECT_PHONE" value="221"/>
4.frameworks/native/include/android/keycode.h
enum {
AKEYCODE_UNKNOWN = 0,
....
....
添加
AKEYCODE_DECT_REGISTER =220,
AKEYCODE_DECT_PHONE =221,
5.frameworks/base/core/java/android/view/KeyEvent.java
添加
public static final int KEYCODE_DECT_REGISTER= 220;
public static final int KEYCODE_DECT_PHONE=221;
修改 LAST_KEYCODE 和 KEYCODE_SYMBOLIC_NAMES
private static final int LAST_KEYCODE = KEYCODE_DECT_REGISTER;
// NOTE: If you add a new keycode here you must also add it to:
// 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
// emulator?
// LAST_KEYCODE
// KEYCODE_SYMBOLIC_NAMES
private static void populateKeycodeSymbolicNames() {
SparseArray<String> names = KEYCODE_SYMBOLIC_NAMES;
names.append(KEYCODE_UNKNOWN, "KEYCODE_UNKNOWN");
...
...
names.append(KEYCODE_DECT_REGISTER, "KEYCODE_DECT_REGISTER");
names.append(KEYCODE_DECT_PHONE, "KEYCODE_DECT_PHONE");
}
修改 isSystem(),追踪jni需要修改frameworks/base/lib/androidrw/input.cpp KeyEvent::isSystemKey
bool KeyEvent::isSystemKey(int32_t keyCode) {
switch (keyCode) {
....
case AKEYCODE_DECT_REGISTER:
case AKEYCODE_DECT_PHONE:
return true;
}
return false;
}
6.external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
修改
enum ANPKeyCodes {
kUnknown_ANPKeyCode = 0,
...
...
kDectRegister_ANPKeyCode=220,
kDectPhone_ANPKeyCode=221,
}
以上修改完成后,可以在PhoneWindowManager 测试下这个两个键是否成功上报,如果上报成功,就可以在自己的应用中添加与这个按键相关的逻辑处理。
添加新的按键过程中可能出现的问题
1.按键框架层中相关变量都添加后,keycode=0.<1>确保驱动上报键值的准确性。
<1>确保确定设备的kl文件。根据 /system/usr/idc 中的idc 文件,以及 在EventHub.cpp中打印 设备的配置 文件,确定设备的kl 文件,设备不止一个kl文件
<3> kl 文件的键值映射正确。
key 123 KEYCODENAME, KEYCODENAME 与驱动没有关系,必须保证这个 keycode 被添加成功。在KeyEvent.java 中的注释中已经说明了用户添加一个新的按键所需要修改的所有文件。
<4> 框架层修改完成后,为了确保正确,将ap侧代码全部编译一遍,重新烧录system.img.在PhoneWindowManager 中验证按键是否正常。
相关文章推荐
- android 获取组件尺寸大小
- 获取当前应用的版本号和当前android系统的版本号
- Android 二维码生成器
- Android如何获取asset下的xml文件,并解析
- android 添加按键(一)
- ijkplayer环境搭建及编译
- android 虚拟摇杆绘制
- Android搜索功能实现
- Android 最火的快速开发框架XUtils
- 【android】开发中遇到的一些问题
- Android中Parcelable接口用法
- androidStudio导包
- Android APK的数字签名的作用和意义
- Android开发教程05:Android项目的目录结构
- Android中探讨自定义控件View
- Android开发教程02:Android四大组件简介
- android完全退出程序(android退出有多个activity的应用)
- 获取android手机信息
- Android中的Environment.getExternalStorageState使用
- Android基础入门教程——10.1 TelephonyManager(电话管理器)