当我们改变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. C++技术问题总结-第11篇 网络通信中主机序网络序

    网络通信常常涉及到字节序转化,接下来理解主机序和网络序有什么异同. ①主机字节顺序HBO(Host Byte Order) 採用小头序(little-endian),从低到高的顺序存储. 低位字节排放 ...

  2. android动画-动画分类及代码演示样例

    原来一直对动画一知半解,仅仅知道依照网上的方法会用即可了,可是自己写起来感觉确实有点费劲,今天最终研究了代码实现,一下子感觉清晰多了.先把总结例如以下,代码中有具体的凝视. 动画分类 1.Peoper ...

  3. xcode project

    An Xcode project is a repository for all the files, resources, and information required to build one ...

  4. SE 2014年4月8日

    1.路由引入的作用? 当网络中运行多种路由协议的时候,由于不同协议的路由算法和度量值等均不相同,路由引入可以将不同协议的路由引入到当前的路由协议中,保证网络的互通. 对比单向入和双向入 单向引入是只将 ...

  5. Java的内存泄漏和垃圾回收机制

    JAVA会产生内存泄露吗?首先,答案是肯定的. Java尽管有垃圾回收器,但依旧存在泄漏. Java内存泄漏跟C/C++内存泄漏的概念不一样:C/C++的内存泄漏是指Malloc了一些资源.最后没有f ...

  6. 用java读写properties文件的代码

    package com.LY; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.F ...

  7. Windows Phone开发(46):与Socket有个约会

    原文:Windows Phone开发(46):与Socket有个约会 不知道大家有没有"谈Socket色变"的经历?就像我一位朋友所说的,Socket这家伙啊,不得已而用之.哈,S ...

  8. 利用sendmsg和recvmsg来指定发送接口或者获取接收数据接口

    前言     sendmsg和recvmsg函数是一对相对下层的套接字发送.接受函数. 通过这对函数,我们能够设置或者取得数据包的一些额外的控制信息.这些信息中比較经常使用的就是本文要介绍的发送.接受 ...

  9. An Overview of Complex Event Processing

    An Overview of Complex Event Processing 复杂事件处理技术概览(一) 翻译前言:我在理解复杂事件处理(CEP)方面一直有这样的困惑--为什么这种计算模式是有效的, ...

  10. Windows 8 应用开发 - 异步调用

    原文:Windows 8 应用开发 - 异步调用     不论是桌面客户端还是Web应用通常会出现处理时间较长的操作,为了在这段时间内不影响用户与应用之间的交互体验,开发人员通常会使用异步调用技术,使 ...