当我们改变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)的更多相关文章

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

    某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(bac ...

  2. Android 物理按键

    import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view. ...

  3. Android常用的物理按键及其触发事件

    Activity和View都能接收触摸和按键,如果响应事件只需要在继承类里复写事件函数即可:当一个视图(如一个按钮)被触摸时,该对象上的 onTouchEvent() 方法会被调用.不过,为了侦听这个 ...

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

    一句代码:driver.keyevent()        括号里填入的是手机物理按键的数字代号 driver.press_keycode()        括号里填入的是键盘按键的数字代号 手机物理 ...

  5. python+appium的物理按键代码

    代码就一句driver.keyevent()括号内填入的是物理按键的数字代号 代号表: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOM ...

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

    最近有一个客户有这样的需求: 1.在[设置]--->[无障碍]中添加一个开关按钮. 如果打开开关的话,双击某个物理按键的时候,打开闪光灯,再双击该物理按键的时候,关闭闪光灯. 如果关闭开关的话, ...

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

    今天在工作中犯了一个错误,写的视频播放器突然物理音量键就不起作用了. 一開始以为是自己定义的音量条把系统的物理音量条按键给屏蔽掉了. 删除自己定义的音量条还是不行,又怀疑是是加入了什么权限之类的.重复 ...

  8. ESP32 开发笔记(十二)LittlevGL 添加自定义字体和物理按键

    LittlevGL 添加自定义字体获取字库 ttf 文件可以从一些网站上获取字库文件,比如请注意字体许可证 生成源文件使用 LittlevGL 提供的字库文件转换工具,将 ttf 字库文件转换为源文件 ...

  9. appium 模拟实现物理按键点击

    appium自动化测试中,当确认,搜索,返回等按键通过定位点击不好实现的时候,可以借助物理按键来实现.appium支持以下物理按键模拟: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ ...

随机推荐

  1. NOJ1184 失落的邮票 哈希表

    意甲冠军 我们共收集N邮票.现在失去了2张,剩下N-2张-..原集邮收集了所有对.因此,找到什么两枚邮票是一个.它们输出. (确定缺少邮票是不一样的) 思路 由于编号比較大,能够用hash表压缩成数组 ...

  2. CH BR4思考熊(恒等有理式-逆波兰表达式求值)

    恒等有理式 总时限 10s 内存限制 256MB 出题人 fotile96 提交情况 4/43 描述 给定两个有理式f(X)与g(X),判断他们是否恒等(任意A,如果f(A)与g(A)均有定义,那么f ...

  3. PHP, Python, Node.js 哪个比较适合写爬虫?

    PHP, Python, Node.js 哪个比较适合写爬虫? 1.对页面的解析能力2.对数据库的操作能力(mysql)3.爬取效率4.代码量推荐语言时说明所需类库或者框架,谢谢.比如:python+ ...

  4. android旋转动画和平移动画具体解释,补充说一下假设制作gif动画放到csdn博客上

    先上效果图: 我这里用的是GifCam来制作的gif动画,能够在http://download.csdn.net/detail/baidu_nod/7628461下载, 制作过程是先起一个模拟器,然后 ...

  5. Android 性能优化 五 性能分析工具dumpsys的使用

    Android提供的dumpsys工具能够用于查看感兴趣的系统服务信息与状态,手机连接电脑后能够直接命令行运行adb shell dumpsys 查看全部支持的Service可是这样输出的太多,能够通 ...

  6. 一个使用Java jdk8中Nashorn(Java javascript引擎)设计的Web开发框架

    地址:https://github.com/iboxdb/hijk 採用给框架开发应用,简单直接.开发效率高 下载后 set PATH to /JAVA 8_HOME/bin jjs build.js ...

  7. Windows Phone开发(43):推送通知第一集——Toast推送

    原文:Windows Phone开发(43):推送通知第一集--Toast推送 好像有好几天没更新了,抱歉抱歉,最近"光荣"地失业,先是忙于寻找新去处,唉,暂时没有下文.而后又有一 ...

  8. Just like normal variables,

    Just like normal variables, pointers can be declared constant. There are two different ways that poi ...

  9. Android 之流媒体播放器,广播侧下方这么简单。

    没有其他的.希望从事流媒体开发案例.还承诺提供朋友博客.上个星期.制定出最后一点机会. 在这里,与大家分享. 首先要明白的概念:什么是流媒体?转载请注明出处http://blog.csdn.net/g ...

  10. python战斗2:看到一个页面编码

    编程环境:虚拟linux (windows 下 cygwin) 识别网页编码. usage: python coding http://www.***.com 測试结果: watermark/2/te ...