您的位置:首页 > 移动开发 > Android开发

Android4.2.2由于越来越多的物理按键(frameworks)

2015-10-27 09:39 501 查看
当我们改变frameworks之后可能:

make: *** [out/target/common/obj/PACKAGING/checkapi-current-timestamp] 错误 38

解决方案:make update-api

在Android中加入物理按键:KEYCODE_HELP

1、Android 添加按键:

ScanCode -> KeyCodeLabel -> KeyCode -> Keyevent

-----

1) 键扫描码ScanCode是由linux的Input驱动框架定义的整数类型,可參考input.h头文件(./external/kernel-headers/original/linux/input.h)。

2) 按键码(KeyCode)。这个按键码是一个整数,在上层的JAVA程序中主要通过这个值来推断系统的实现。

----

实现过程:

1, ScanCode -> KeyCodeLabel。

键盘布局文件(*.kl) 把ScanCode转换为KeyCodeLabel。

*.kl文件在源代码的devices目录中如(/device/rockchip/rk30sdk_bnd/rk29-keypad.kl)或设备中的/system/usr/keylayout/*.kl。

key 138 HELP //这里的HELP就是我们定义的android键值的字符形式,138则是linux键值, HELP 不能无缘无故就使用。必定有定义位置,这个位置就是KeycodeLabels.h

2,KeyCodeLabel -> KeyCode。

通过查找KEYCODES[]数组,得到KeyCodeLabel字符串相应的KeyCode值。

KEYCODES[]在文件/frameworks/base/include/androidfw/KeycodeLabels.h 中。

这里定义的实际上是我们在kl文件,也就是linux key到android key的一个映射表中的linux键值和android键值的名称;比方rk29-keypad.kl:

static const KeycodeLabel KEYCODES[] = {

...

{ "ASSIST", 219 },

//add by hcm

{ "HELP", 220 },

在/frameworks/native/include/android/keycodes.h中定义KeyCode的枚举值。

enum {

....

AKEYCODE_ASSIST = 219,

//add by hcm

AKEYCODE_HELP = 220,

......}

在EventHub.cpp中载入并解析这个map:rk29-keypad.kl。那么得到的是linux键值138为key的string,这个string就是HELP,有了上面这个KEYCODES数组。就能够获得它相应的android键值了。

3,KeyCode -> Keyevent。

KeyEvent.java中的相应KeyCode:(文件路径:/frameworks/base/core/java/android/view/KeyEvent.java)。

KeyEvent.java中有一个很重要的提示,那就是我们自己填特殊按键的流程,可是我这是瑞芯微3168,Android4.2.2的源代码,源代码中的凝视路径是有误的!



// 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 应该为:/frameworks/base/include/androidfw/KeycodeLabels.h

// external/webkit/WebKit/android/plugins/ANPKeyCodes.h

// frameworks/base/core/res/res/values/attrs.xml

// emulator?

// LAST_KEYCODE

// KEYCODE_SYMBOLIC_NAMES

//

// 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.

假设修改了KeyEvent,影响到API则须要调用make update-api。

LAST_KEYCODE改动:

/** Key code constant: add by hcm, help key. */

public static final int KEYCODE_HELP = 220;

private static final int LAST_KEYCODE = KEYCODE_HELP;

....

(KEYCODE_SYMBOLIC_NAMES改动)

names.append(KEYCODE_ASSIST, "KEYCODE_ASSIST");

names.append(KEYCODE_HELP, "KEYCODE_HELP");

....

4、依据上面提示改动isSystem()。代码跟踪:

isSystem() 在/frameworks/base/core/java/android/view/KeyEvent.java

public final boolean isSystem() {

return native_isSystemKey(mKeyCode);

}

/frameworks/base/core/jni/android_view_KeyEvent.cpp

static jboolean native_isSystemKey(JNIEnv* env, jobject clazz, jint keyCode) {

return KeyEvent::isSystemKey(keyCode);

}

/frameworks/base/libs/androidfw/Input.cpp

bool KeyEvent::isSystemKey(int32_t keyCode) {

switch (keyCode) {

……

case AKEYCODE_SEARCH:

//add by hcm

case AKEYCODE_HELP:

}

}

5、/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h

enum ANPKeyCodes {

……

kAppSwitch_ANPKeyCode = 187,

//add by hcm

kHelp_ANPKeyCode = 220,

};

6、frameworks/base/core/res/res/values/attrs.xml

<attr name="keycode">

.....................

<enum name="KEYCODE_RO" value="217" />

<enum name="KEYCODE_KANA" value="218" />

<enum name="KEYCODE_HELP" value="220" />

</attr>

</attr>

这些操作完毕了之后,就完毕了linux键到android的键值映射。也就是android在超过一个KEYCODE_HELP其值它是220.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: