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)的更多相关文章
- android4.0下如何判断手机是否有底部物理按键(menu物理按键)
某些手机底部是在触摸屏内部有软按键,就是如(back,home,menu 等)而有的手机底部(非屏幕内部)有物理按键,就是生产厂商不愿意有google自带的虚拟按键,而做的电容式的物理按键,如(bac ...
- Android 物理按键
import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view. ...
- Android常用的物理按键及其触发事件
Activity和View都能接收触摸和按键,如果响应事件只需要在继承类里复写事件函数即可:当一个视图(如一个按钮)被触摸时,该对象上的 onTouchEvent() 方法会被调用.不过,为了侦听这个 ...
- python+appium模拟手机物理按键操作
一句代码:driver.keyevent() 括号里填入的是手机物理按键的数字代号 driver.press_keycode() 括号里填入的是键盘按键的数字代号 手机物理 ...
- python+appium的物理按键代码
代码就一句driver.keyevent()括号内填入的是物理按键的数字代号 代号表: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOM ...
- Android系统移植与调试之------->增加一个双击物理按键打开和关闭闪光灯并将闪光灯状态同步到下拉菜单中
最近有一个客户有这样的需求: 1.在[设置]--->[无障碍]中添加一个开关按钮. 如果打开开关的话,双击某个物理按键的时候,打开闪光灯,再双击该物理按键的时候,关闭闪光灯. 如果关闭开关的话, ...
- 关于Android中物理按键不响应的可能的一个问题。
今天在工作中犯了一个错误,写的视频播放器突然物理音量键就不起作用了. 一開始以为是自己定义的音量条把系统的物理音量条按键给屏蔽掉了. 删除自己定义的音量条还是不行,又怀疑是是加入了什么权限之类的.重复 ...
- ESP32 开发笔记(十二)LittlevGL 添加自定义字体和物理按键
LittlevGL 添加自定义字体获取字库 ttf 文件可以从一些网站上获取字库文件,比如请注意字体许可证 生成源文件使用 LittlevGL 提供的字库文件转换工具,将 ttf 字库文件转换为源文件 ...
- appium 模拟实现物理按键点击
appium自动化测试中,当确认,搜索,返回等按键通过定位点击不好实现的时候,可以借助物理按键来实现.appium支持以下物理按键模拟: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ ...
随机推荐
- bzoj 3519: [Zjoi2014] 消棋子 题解
[序言]在大家怀疑的眼光下,我做了一个中午和半个下午.调了一个晚上的题目总算A了! [原题] 消棋子是一个有趣的游戏.游戏在一个r * c的棋盘上进行.棋盘的每一个格 子.要么是空,要么是一种颜色的棋 ...
- TSL230选型
tsl230是一种可以直接将光强转化成频率值的器件.详细原理就不介绍了,数据手冊里写的都非常清楚,230系列包括非常多种,主要为下面四类:TSL230,TSL230A,TSL230B系列:TSL230 ...
- HashMap-死锁导致cpu占用100%分析(转)
最近项目里面的一段千年代码出了问题,这个问题以前也出现过,不过不是那么明显,这次迁移机器由以前的4台机子变成2台以后问题被放大,最终不得不解决,特此分析一下. 先放出问题的代码 ? 1 2 3 4 5 ...
- Redis11种Web应用场景
Redis的一个非常大优点就是能够不用整个转入到这个数据库,而是能够沿用之前的MySQL等数据库,而仅在一些特定的应用场景通过Redis的特性提高效率.本文列出了11个这种Web应用场景,如显示最新的 ...
- ecshop 后台批量上传商品 完整上传
ecshop 后台批量上传商品,之所以无法上传,是因为后台上传php文件方法中没有导入商品原图路径 将ecshop根目录中的admin/goods_batch.php文件全部修改为 <?php ...
- Android点滴---ViewHolder通用,优雅写法
近期在做项目时,又要写 ViewHolder. 突然想到网上看看有没什么好的写法! 不知道你是不是也烦透了写那些没有技术含量的ViewHolder 看看这些.也许会有收获! 然后就找到了以下两篇文章( ...
- sgu 286. Ancient decoration(最小环覆盖)
给你一个n个点,每个点度为k(k为偶数)的无向图,问是否能将图中的n条边染色,使得每个点都拥有两条被染色的边.也就是说,是否存在拥有原图中n条边的子图,使得每个点的度为2?仔细想想,每个点的度为2,实 ...
- IOS开发-通知与消息机制
在多数移动应用中不论什么时候都仅仅能有一个应用程序处于活跃状态.假设其它应用此刻发生了一些用户感兴趣的那么通过通知机制就能够告诉用户此时发生的事情. iOS中通知机制又叫消息机制,其包含两类:一类是本 ...
- swift笔记 (三) —— 字符和字符串
字符串和字符 苹果要是不提供了unicode的字符串和字符,那就是他们公司全部人的脑袋都被门夹过 他自己家都要发非常多国家的版本号的软件,怎么可能不用unicode呢 此处略去30字... 这里能够拿 ...
- uva 11427 - Expect the Expected(概率)
题目链接:uva 11427 - Expect the Expected 题目大意:你每天晚上都会玩纸牌,每天固定最多玩n盘,每盘胜利的概率为p,你是一个固执的人,每天一定要保证胜局的比例大于p才会结 ...