Android4.2.2自增物理按键(frameworks)

当我们修改了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.

Android4.2.2自增物理按键(frameworks)

时间: 2024-10-13 15:40:55

Android4.2.2自增物理按键(frameworks)的相关文章

android4.0下如何判断手机是否有底部物理按键(menu物理按键)

某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(back,home,menu 等)android4.0下可以用此判断是否有物理按键:ViewConfiguration.get(this).hasPermanentMenuKey(); android4.0下如何判断手机是否有底部物理按键(menu物理按键),布布扣,bubuko.com

宏-新项目物理按键不能用

这几次移植代码的时候,经常发现三个物理按键不起效果,后来发现是快捷手电筒引起的.解决的思路很简单,就是把快捷手电筒关掉,解决方法有两个 1.把宏关掉.这个操作起来稍微麻烦一些,因为你关掉了宏以后,还必须重新编译,而且,因为可能有patch,所以你要关好几处的宏.如下 1)关掉ProjectConfig.mk.global中的宏 [email protected]7817:~/PROJECT/PROJECT_V5/52_kk_qhd_k25$ cd mediatek/config/common/

Android系统移植与调试之-------&gt;增加一个双击物理按键打开和关闭闪光灯并将闪光灯状态同步到下拉菜单中

最近有一个客户有这样的需求: 1.在[设置]--->[无障碍]中添加一个开关按钮. 如果打开开关的话,双击某个物理按键的时候,打开闪光灯,再双击该物理按键的时候,关闭闪光灯. 如果关闭开关的话,双击该物理按键的时候,不做任何处理. 2.打开关闭闪光灯的状态,在下拉菜单中也要同步. 如下图所示的效果: 当打开上面添加的开关后,如果双击POC键(POC键是我们公司自定义的一个物理按键)的时候,就打开闪光灯,并将下拉菜单中的闪光灯图标点亮,如下图所示 如果再次双击POC键(POC键是我们公司自定义的一

彩扩机项目--两个状态指示灯,巧妙的使用二极管的特性,以及物理按键的滤波

对于物理按键,按下和弹起时,会发生较大的电源波动,从而使得后面的三极管产生波动,使用电阻和电容可以将电压得变化变平缓. 左图是没有使用电阻和电容滤波,按键产生的电压波动.右图是使用电阻和电容滤波后的电压.通过调整电阻和电容的值可以改变图示时间t,一般选取时间为5us 因为散热马达转动时,红色LED亮,所以红色LED和散热马达并联. 为了使红色LED灯亮,而绿色LED灯灭,使用了一个二极管,当二极管导通时,绿色LED灯两端电压为1.7V,不足以点亮绿色LED.

关于Android中物理按键不响应的可能的一个问题。

今天在工作中犯了一个错误,写的视频播放器突然物理音量键就不起作用了.一开始以为是自定义的音量条把系统的物理音量条按键给屏蔽掉了.删除自定义的音量条还是不行,又怀疑是是添加了什么权限之类的,反复尝试都不是那些原因.最后发现是onKeyDown物理按键的监听事件的问题!!!重新onKeyDown方法的时候,我竟然鬼使神差的返回true!!!返回true的意思是不是back按钮的都不继续往下传递响应,就是这里的原因.改成return false就好了.以此为戒,谨记谨记!!! 版权声明:本文为博主原创

Android 物理按键

1 import android.app.Activity; 2 import android.os.Bundle; 3 import android.util.Log; 4 import android.view.KeyEvent; 5 import android.widget.Toast; 6 7 public class MainActivity extends Activity { 8 9 10 @Override 11 protected void onCreate(Bundle s

cocos2d-x之监听手机的物理按键

1 //如何监听按键事件 2 //创建物理按键的监听事件 3 auto listener = EventListenerKeyboard::create(); 4 //按键被释放时执行的操作,EventKeyboard::KeyCode表示按键代码 5 listener->onKeyReleased = [](EventKeyboard::KeyCode code,Event *e){ 6 log("Key Code : %d",code);//显示按键的值 7 //按下后退键关

python+appium模拟手机物理按键操作

一句代码:driver.keyevent()        括号里填入的是手机物理按键的数字代号 driver.press_keycode()        括号里填入的是键盘按键的数字代号 手机物理键数字代码 键盘按键数字代号 原文地址:https://www.cnblogs.com/xiaobaixiaobai/p/10760943.html

添加自定义字体和物理按键

LittlevGL 添加自定义字体获取字库 ttf 文件可以从一些网站上获取字库文件,比如请注意字体许可证 生成源文件使用 LittlevGL 提供的字库文件转换工具,将 ttf 字库文件转换为源文件.将生成的源文件添加到 LittlevGL 工程中,添加以下代码声明字体:extern lv_font_t my_font_name; 1或者 LV_FONT_DECLARE(my_font_name);1源代码中使用这个字体可以: style.text.font = &my_font_name;1