Android4.2增加新键值
这里添加新的键值,不是毫无凭据凭空创造的一个键值,
而是根据kernel中检测到的按键值,然后转化为android所需要的数值:
以添加一个linux键值为217,把它映射为android的键值Browser(这个键值之前不存在)为例介绍一下:
一、android之前没有这个键值,需要定义
/frameworks/base/core/java/android/view/KeyEvent.java
//定义这个新的键值
public static final int KEYCODE_BROWSER = 220;(在我这套代码里已经最大是219了,所以我们新加一个定义为220)
然后我们会看到有如下注释:
- // 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
- // 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.
LAST_KEYCODE也就是最后一个keycode,因为添加了新的,所以需要更改这个的数值
- LAST_KEYCODE = KEYCODE_BROWSER
- private static final
- SparseArray KEYCODE_SYMBOLIC_NAMES = new SparseArray();
- private static void populateKeycodeSymbolicNames() {
- ……
- names.append(KEYCODE_MUSIC, "KEYCODE_MUSIC");
- names.append(KEYCODE_CALCULATOR, "KEYCODE_CALCULATOR");
- names.append(KEYCODE_BROWSER, "KEYCODE_BROWSER");
- }
上面的注释已经为我们指明了添加键值所需要的步骤:
二、/frameworks/base/core/java/android/view/KeyEvent.java
- public final boolean isSystem() {
- return native_isSystemKey(mKeyCode);
- }
- /frameworks/base/jni/android_view_KeyEvent.java
- 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_BROWSER:
- return true;
- }
- }
三、/frameworks/native/include/android/keycodes.h
- /*
- * Key codes.
- */
- enum {
- ……
- AKEYCODE_CALCULATOR = 210,
- AKEYCODE_BROWSER = 220,
- }
四、/frameworks/base/include/androidfw/KeycodeLabels.h
这里定义的实际上是我们在kl文件,也就是linux key到android key的一个映射表中的linux键值和android键值的名称;
比如frameworks/base/data/keyboards/Generic.kl:
……
key 217 BROWSER //这里的BROWSER就是我们定义的android键值的字符形式,217则是linux键值
那么,BROWSER不能无缘无故就使用,必然有定义位置,这个位置就是KeycodeLabels.h
- static const KeycodeLabel KEYCODES[] = {
- ……
- { "CALCULATOR", 210 },
- {"BROWSER", 220}, //这里的BROWSER就是我们上面使用的东西,而220是android键值
- { NULL, 0}
- }
在EventHub.cpp中加载并解析这个map:frameworks/base/data/keyboards/Generic.kl,那么得到的是linux键值217为key的string,这个string就是BROWSER,有了上面这个KEYCODES数组,就可以获得它对应的android键值了。
五、/external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
- enum ANPKeyCodes {
- ……
- kAppSwitch_ANPKeyCode = 186,
- kBrowser_ANPKEYCODE = 220,
- };
六、/frameworks/base/core/res/res/values/attrs.xml
<enum name="KEYCODE_YEN" value="216" />
<enum name="KEYCODE_RO" value="217" />
<enum name="KEYCODE_KANA" value="218" />
<enum name="KEYCODE_INTERCOM" value="220" />
这些操作完成了之后,就完成了linux键到android的键值映射。
也就是android中多了一个KEYCODE_BROWSER它的值是220.
Linux部分简单,就是在kernel/include/linux/input.h里面加入#define BROWSER 217
然后在事件上报的时候,把217报上去就OK啦。
Android4.2增加新键值的更多相关文章
- Android4.0 添加一个新的Android 键值
这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为Android所需要的数值: 以添加一个Linux键值为217,把它映射为android的键值Brow ...
- android 添加新的键值,自定义按键-2【转】
本文转载自:http://blog.csdn.net/mr_raptor/article/details/8053871 在Android中,上层可使用的键值默认情况下是92个,从0-91:一般情况下 ...
- android 添加新的键值,自定义按键【转】
本文转载自:http://blog.csdn.net/mr_raptor/article/details/8053871 在Android中,上层可使用的键值默认情况下是92个,从0-91:一般情况下 ...
- php 中 使用foreach为数组增加键值对
php 中的 foreach 在php中,使用foreach来遍历数组的频率很高,并且其性能要高于 list() 和 each() 结合来遍历数组: 当遍历二位数组的第一层数组,并要给第二位数组增加一 ...
- Javascript对象数据类型(键值对)的创建和使用方法
对象数据类型(键值对) 1.创建键值对 var arry={name:"小明",age:20,isgey:falet} // var 键值对名 = {键:值,键:值} 2.增加键值 ...
- RK3288 红外遥控器增加系统中已有的键值
转载请注明出处:https://www.cnblogs.com/lialong1st/p/10066673.html CPU:RK3288 系统:Android 5.1 1.查看遥控器的用户码和键值, ...
- Android下添加新的自定义键值和按键处理流程
Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我 ...
- 一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户、某时间、对某表、某主键、某字段的修改(新旧值
一种历史详细记录表,完整实现:CommonOperateLog 详细记录某用户.某时间.对某表.某主键.某字段的修改(新旧值). 特别适用于订单历史记录.重要财务记录.审批流记录 表设计: names ...
- Android下添加新的自定义键值和按键处理流程【转】
本文转载自: Android下添加新的自定义键值和按键处理流程 说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我一 ...
随机推荐
- 接口中的成员变量必须是static
首先要弄清接口的含义. 接口就是提供一种统一的'协议’, 而接口中的属性也属于'协议’中的成员.它们是公共的,静态的,最终的常量.相当于全局常量. 在interface里面的变量都是public st ...
- Hibernate四 批量处理
Hibernate批量处理一 批量插入将很多条记录插入数据库时,Hibernate通常会采用以下做法:public void test() { for(int i=0;i<1000;i++){ ...
- mybatis 关联对象mapper.xml的写法
https://github.com/zfrHJ/mybaties/blob/master/mybaties/src/com/itheima/mybatits/mapper/OrdersMapperC ...
- java_method_Log输出日志的方法
package cn.com.qmhd.tools; import org.apache.log4j.Logger; import org.apache.log4j.PropertyConfigura ...
- 安卓四大组件之一activity
概要说明 Activity是Android组件中最基本也是最为常见用的四大组件(Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播 ...
- C#实现文件数据库
本文转载:http://www.cnblogs.com/gaochundong/archive/2013/04/24/csharp_file_database.html#commentform 本文为 ...
- Cocostudio学习笔记(1) 扯扯蛋 + 环境搭建
转眼七月份就到了,2014已经过了一半,而我也最终算是有"一年工作经验"了,开心ing. 回想这一年Cocos2dx的游戏开发经历,去年下半年重心主要在游戏的逻辑上,而今年上半年重 ...
- CSDN markdown 编辑器 第四篇 LaTex语法
Latex是为了写数学公式的. 嗯-但实际这样的语言的作用是为了排版的.数学公式仅仅是他的附加属性. 可是markdown引入这个全然是为了写公式.其它的Latex语法不支持. CSDN markdo ...
- linux中 vi / vim显示行号或取消行号命令
1. 显示行号 :set number 或者 :set nu 2. 取消行号显示 :set nu! 3. 每次打开都显示行号 修改vi ~/.vimrc 文件,添加:set number
- Python爬虫:获取糗事百科笑话
为了收集笑话也是挺拼的,我就不相信你所有的都看过了.还有,请问哪位仁兄能指点之下怎么把网上抓取到的图片写到word里面,捉摸了好久都没弄出来. 糗百不需要登录,html直接解析,只要在reques ...