遥控器测试程序相关技术文档
1. 关于如何屏蔽部分特殊按键
遥控器中有些特殊按键是经过Android 特殊处理的 ,在--中,这些特殊按键会妨碍遥控器按钮的测试,所以必须屏蔽。
屏蔽的方法有一下几种:
1. 在PhoneWindowManager.java中,对于特殊按钮部分的代码进行处理。
2. 在onkeydown()方法中,获得对应按钮的keycode之后,进行自己想要的操作,然后 return true。但是这种处理只能对
部分按钮有效果,如vol+,vol- 等,但对于Home,Power键是无效的。而且这种处理只有在当前的activiy中才会有效,在
别的界面中就失效了,局限性很严重。
3. 在framework中修改,遥控器中的每个按钮在整个源码中都是有码值表对应的,而且Android应用层和linux层各有一张。
Android应用层:
路径:frameworks/base/include/ui/KeycodeLabels.h
格式: { "A", 29 }, { "B", 30 }, { "C", 31 },通过键值对的方式进行存储的。字符串是遥控器上的按键,
数值是对应的onkeydown()中的Keycode。
linux层:
地址:frameworks/base/data/keyboards/Generic.kl
格式:key 16 Q ,Q指的是按钮, 16是底层传上来的一个数值,在linux层中使用。
可以看出这两个表是互相联系的,通过按钮的文字信息可以将两个表关联起来。这里,对于一些特殊键,只需要改变Android应用层
的码值就可以了,因为特殊处理是在应用层中的PhoneWindowManager.java中,在onkeydown()方法中,只需要接收你更改后的那
个码值就可以了,同时也屏蔽了特栓按钮。
2. 关于如何得到不确定按键的码值
打开串口,在串口中输入getevent指令,此时按下某个不确定的按钮 ,终端会出现如下结果:
/dev/input/event8: 0004 0004 000c01b6
/dev/input/event8: 0001 00e2 00000001
/dev/input/event8: 0000 0000 00000000
看第二行第二列的值: e2 ,这是16进制的数值,转换为10进制为226 ,在Generic.kl中对应226查询结果为key 226 MEDIA_BROWSER
,然后再通过MEDIA_BROWSER ,在KeycodeLabels.h 中找出对应 MEDIA_BROWSER 的数值,就是keyevent 中要得到的keycode。
3. 关于如何重新定义按钮
1.获得按钮的原始ir值 :IR scan keycode: 0xcd323e01
2.在kernel/include/linux/input.h 中定义自己按钮的名称 如:#define KEY_WJ_TV 248
3.到kernel/drivers/amlogic/input/irremote/cvt_iptv_rc_decoder.h ,将ir值和名称关联定义 ,如:
{0xcc333e01, KEY_WJ_TV, 0},
{0xcd323e01, KEY_WJ_TV, 0},
4.在以下的文件中都要加上
(1)+++ b/include/ui/KeycodeLabels.h
@@ -249,6 +249,10 @@ static const KeycodeLabel KEYCODES[] = {
{ "TV_REPEAT", 221},
{ "TV_SUBTITLE", 222},
{ "TV_SWITCH", 223},
+
+
+ { " APPS_VIEW ", 224},
+
<2>
+++ b/core/res/res/values/attrs.xml
@@ -1508,6 +1508,9 @@
<enum name="KEYCODE_EARLY_POWER" value="218" />
<enum name="KEYCODE_TV_SLEEP" value="219" />
+ <enum name="KEYCODE_APPS_VIEW" value="224" />
+
<3>
+++ b/core/java/android/view/KeyEvent.java
@@ -618,8 +618,10 @@ public class KeyEvent extends InputEvent implements Parcela
public static final int KEYCODE_TV_SUBTITLE = 222;
public static final int KEYCODE_TV_SWITCH = 223;
+
+ public static final int KEYCODE_APPS_VIEW = 224;
- private static final int LAST_KEYCODE = KEYCODE_TV_SWITCH;
+ private static final int LAST_KEYCODE = KEYCODE_APPS_VIEW;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
@@ public class KeyEvent extends InputEvent implements Parcelab
names.append(KEYCODE_TV_REPEAT, "KEYCODE_TV_REPEAT");
names.append(KEYCODE_TV_SUBTITLE, "KEYCODE_TV_SUBTITLE");
names.append(KEYCODE_TV_SWITCH, "KEYCODE_TV_SWITCH");
names.append(KEYCODE_APPS_VIEW, "KEYCODE_APPS_VIEW");
};
5. 在板卡的系统中/system/usr/keylayout/Generic.kl 和 qwerty.kl 中都加上 key 248 KEY_WJ_TV。
4. 过程中出现的问题处理
1. 在新定义按钮后,在编译的过程中会出现以下的问题:
You have tried to change the API from what has been previously approved.
并有以下的提示:、
******************************
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
1) You can add "@hide" javadoc comments to the methods, etc. listed
in the
errors above.
2) You can update current.xml by executing the following commands:
p4 edit frameworks/base/api/current.xml
make update-api
To check in the revised current.xml, you will need OWNERS
approval.
******************************
解决办法:
1. 在你添加的API或者变量前面,(在java类中找到自己定义的变量)增加javadoc 注释@hide。但是要注意的是,
并不是简单写个@hide 或者 /*@hide*/ 就可以了,这些都是错误的javadoc注释格式,标准的javadoc都是这样的 /** */ 而且
对于 format 变量 应该加上 { }。所以我们应该这样写 /** {@hide} */
1. 关于如何屏蔽部分特殊按键
遥控器中有些特殊按键是经过Android 特殊处理的 ,在--中,这些特殊按键会妨碍遥控器按钮的测试,所以必须屏蔽。
屏蔽的方法有一下几种:
1. 在PhoneWindowManager.java中,对于特殊按钮部分的代码进行处理。
2. 在onkeydown()方法中,获得对应按钮的keycode之后,进行自己想要的操作,然后 return true。但是这种处理只能对
部分按钮有效果,如vol+,vol- 等,但对于Home,Power键是无效的。而且这种处理只有在当前的activiy中才会有效,在
别的界面中就失效了,局限性很严重。
3. 在framework中修改,遥控器中的每个按钮在整个源码中都是有码值表对应的,而且Android应用层和linux层各有一张。
Android应用层:
路径:frameworks/base/include/ui/KeycodeLabels.h
格式: { "A", 29 }, { "B", 30 }, { "C", 31 },通过键值对的方式进行存储的。字符串是遥控器上的按键,
数值是对应的onkeydown()中的Keycode。
linux层:
地址:frameworks/base/data/keyboards/Generic.kl
格式:key 16 Q ,Q指的是按钮, 16是底层传上来的一个数值,在linux层中使用。
可以看出这两个表是互相联系的,通过按钮的文字信息可以将两个表关联起来。这里,对于一些特殊键,只需要改变Android应用层
的码值就可以了,因为特殊处理是在应用层中的PhoneWindowManager.java中,在onkeydown()方法中,只需要接收你更改后的那
个码值就可以了,同时也屏蔽了特栓按钮。
2. 关于如何得到不确定按键的码值
打开串口,在串口中输入getevent指令,此时按下某个不确定的按钮 ,终端会出现如下结果:
/dev/input/event8: 0004 0004 000c01b6
/dev/input/event8: 0001 00e2 00000001
/dev/input/event8: 0000 0000 00000000
看第二行第二列的值: e2 ,这是16进制的数值,转换为10进制为226 ,在Generic.kl中对应226查询结果为key 226 MEDIA_BROWSER
,然后再通过MEDIA_BROWSER ,在KeycodeLabels.h 中找出对应 MEDIA_BROWSER 的数值,就是keyevent 中要得到的keycode。
3. 关于如何重新定义按钮
1.获得按钮的原始ir值 :IR scan keycode: 0xcd323e01
2.在kernel/include/linux/input.h 中定义自己按钮的名称 如:#define KEY_WJ_TV 248
3.到kernel/drivers/amlogic/input/irremote/cvt_iptv_rc_decoder.h ,将ir值和名称关联定义 ,如:
{0xcc333e01, KEY_WJ_TV, 0},
{0xcd323e01, KEY_WJ_TV, 0},
4.在以下的文件中都要加上
(1)+++ b/include/ui/KeycodeLabels.h
@@ -249,6 +249,10 @@ static const KeycodeLabel KEYCODES[] = {
{ "TV_REPEAT", 221},
{ "TV_SUBTITLE", 222},
{ "TV_SWITCH", 223},
+
+
+ { " APPS_VIEW ", 224},
+
<2>
+++ b/core/res/res/values/attrs.xml
@@ -1508,6 +1508,9 @@
<enum name="KEYCODE_EARLY_POWER" value="218" />
<enum name="KEYCODE_TV_SLEEP" value="219" />
+ <enum name="KEYCODE_APPS_VIEW" value="224" />
+
<3>
+++ b/core/java/android/view/KeyEvent.java
@@ -618,8 +618,10 @@ public class KeyEvent extends InputEvent implements Parcela
public static final int KEYCODE_TV_SUBTITLE = 222;
public static final int KEYCODE_TV_SWITCH = 223;
+
+ public static final int KEYCODE_APPS_VIEW = 224;
- private static final int LAST_KEYCODE = KEYCODE_TV_SWITCH;
+ private static final int LAST_KEYCODE = KEYCODE_APPS_VIEW;
// NOTE: If you add a new keycode here you must also add it to:
// isSystem()
@@ public class KeyEvent extends InputEvent implements Parcelab
names.append(KEYCODE_TV_REPEAT, "KEYCODE_TV_REPEAT");
names.append(KEYCODE_TV_SUBTITLE, "KEYCODE_TV_SUBTITLE");
names.append(KEYCODE_TV_SWITCH, "KEYCODE_TV_SWITCH");
names.append(KEYCODE_APPS_VIEW, "KEYCODE_APPS_VIEW");
};
5. 在板卡的系统中/system/usr/keylayout/Generic.kl 和 qwerty.kl 中都加上 key 248 KEY_WJ_TV。
4. 过程中出现的问题处理
1. 在新定义按钮后,在编译的过程中会出现以下的问题:
You have tried to change the API from what has been previously approved.
并有以下的提示:、
******************************
You have tried to change the API from what has been previously approved.
To make these errors go away, you have two choices:
1) You can add "@hide" javadoc comments to the methods, etc. listed
in the
errors above.
2) You can update current.xml by executing the following commands:
p4 edit frameworks/base/api/current.xml
make update-api
To check in the revised current.xml, you will need OWNERS
approval.
******************************
解决办法:
1. 在你添加的API或者变量前面,(在java类中找到自己定义的变量)增加javadoc 注释@hide。但是要注意的是,
并不是简单写个@hide 或者 /*@hide*/ 就可以了,这些都是错误的javadoc注释格式,标准的javadoc都是这样的 /** */ 而且
对于 format 变量 应该加上 { }。所以我们应该这样写 /** {@hide} */