前言:TV 上遥控器键值怎么样对应到android的系统中,最近一个客户需要在我们的平台上修改,所以,我顺便做了一下总结,方便以后参考。

请转载的朋友一定加上出处,十分感谢~~

第一步:

init.rc:通过service remotecfg /system/bin/remotecfg /system/etc/remote.conf在开机init阶段,将remote.conf中的配置通过ioctl赋值到ir驱动的变量中(用户空间—>内核空间),这样遥控定制化配置才会生效。remotecfg程序代码位于external/remoteconf/irremote.c,可以在设备的/system/bin/下找到它并手动运行#./system/bin/remotecfg /system/etc/remote.conf

第二步:

红外驱动(Linux内核层):Linux irremote driver将依照红外驱动配置文件,将红外键值ircode映射为Linux标准键盘扫描码scancode。这个过程即将红外遥控器的按键事件转换为Linux的标准input event。a) 红外驱动配置文件/system/etc/remote.confb)标准键盘扫描码kernel/include/linux/input.h(在几次遥控器定制化中,尚未修改过该文件)

第三步:

Andriod层:windows manager从irremote driver中读出key event,再通过/system/usr/keylayout/aml_keypad.kl文件,将标准input设备的scan code映射为Andriod API按键KEYCODE字符串。最终scancode和keycode被window manager发送到应用程序,被其focus view消化处理。例如:key 113 SEARCH官方称.kl为key layout map file。

映射/配置文件说明

ircode映射为scan code: device/a***c/xxx/remote.conf

#a***c NECremote

factory_code = 0xfb040001 //每个设备都有独特的factory code. 格式custom_code(16bit)+index_code(16bit) //例子: 0xfb040001= 0xfb04(客户码) + 0001 (低16位可填写任意值)

key_begin //按键映射表 0x47 11 //0x47是红外键值,11是对应的标准按键scancode,可以多个键值对应一个scancode

0x5C 97

……

key_end //按键映射表结束

mouse_begin //鼠标方向映射表,每行

0 0x10 //0是方向数字表示符(Left),对应红外按键键值0x10

1 0x11 //方向键右

2 0x0b //方向键上

3 0x0e //方向键下

mouse_end //鼠标方向映射表结束

scancode与KEYCODE字符串映射:

在2.3系统中,位于源码目录的device/a***c/xxx/ aml_keypad.kl

在4.0系统中,位于源码目录的device/a***c/xxx/Vendor_0001_Product_0001.kl

.....................

key 9 8

key 10 9

key 11 0

key 228 POUND

key 227 STAR

key 231 CALL

key 61 CALL

key 97 DPAD_CENTER

key 108 DPAD_DOWN

key 103 DPAD_UP

key 102 HOME

key 114 VOLUME_DOWN

KEYCODE字符串转换为Andriod UI键值:frameworks/base/include/ui/KeycodeLabels.h

static const KeycodeLabel KEYCODES[] = {

{ "SOFT_LEFT", 1 },

{ "HOME", 3 },

{ "BACK", 4 },

{ "CALL", 5 },

{ "ENDCALL", 6 },

{ "0", 7 },

{ "1", 8 },

{ "2", 9 },

{ "3", 10 },

{ "4", 11 },

{ "5", 12 },

{ "STAR", 17 },

{ "POUND", 18 },

{ "DPAD_UP", 19 },

{ "VOLUME_UP", 24 },

.........................................

键盘scancode定义:kernel/include/linux/input.h

......

#define KEY_SPACE 57

#define KEY_CAPSLOCK 58

#define KEY_F1 59

#define KEY_F2 60

#define KEY_F3 61

#define KEY_F4 62

#define KEY_F5 63

#define KEY_F6 64

#define KEY_F7 65

#define KEY_F8 66

#define KEY_F9 67

#define KEY_F10 68

........

案例一:新平台增加/移植遥控器代码

mid产品往往没有遥控器,如果要增加遥控器的支持,需要从mbox代码中拷贝以下文件和目录:

1)遥控器驱动:kernel\drivers\a***c\input\irremote

2)Andriod 遥控器service:external\remoteconf目录

3)init.rc中启动service remotecfg

# remote

service remotecfg /system/bin/remotecfg /system/etc/remote.conf

class main

oneshot

4)拷贝定制化remote.conf与kl两个文件

案例二:遥控器静音键改为设置键(不新增按键)

1) 按下遥控静音键,观察串口打印出的ircode

2) 在板子的/system/etc/remote.conf文件中找到静音键的ircode与scancode对应行,如下: 0x0c 113

3) 在板子的/system/usr/keylayout/aml_keypad.kl或Vendor_0001_Product_0001.kl中找到scancode 113所在行:

key 113 SEARCH

4) 将keycode ‘SEARCH’ 修改为需要的KEYCODE字符串。

5) 重新编译

案例三:遥控器增加新按键功能

新增按键的遥控器往往不是我们公版遥控器,不能利用现有按键实现特定功能,需要在系统中新增以支持特定APK应用场景。

1) 通过打印找出新增按键的ircode

2) 在device\a***c\xxx\remote.conf找到ircode对应行,或新建一行。这个文件中需要注意factory_code = 0xfd020001 是遥控器的客户码,必须与实体遥控器对应。

3) 修改device\a***c\xxx\aml_keypad.kl或Vendor_0001_Product_0001.kl

添加时依照上下文的格式:例如 key 1 BACK这行中,"1"对应remote.conf 中的scancode,"BACK" 就是需要在后面keycodeLabels.h中定义的字串,新增按键可以自定义这个字串,比如RED。

4) frameworks/base/include/ui/KeycodeLabels.h,在KEYCODES[]数组后面顺序添加:

...

{ "RED", 141},

{ NULL, 0 }

注意:

a) 追加的按键须在末行的{ NULL, 0 }前面。 在这个地方,会将RED等这些字符串转换成数值、键值,传送到KeyEvent.java中。

b) RED后面的数值,需要与客户协商,客户APK应该专门处理这个新建的141值。

c) 141的值不应与其他keycode重复,建议新增键的取值依照上文的值,依次累加。

5)在frameworks/base/core/res/res/values/attrs.xml中追加:

6)在frameworks/base/core/java/android/view/KeyEvent.java中添加:

public static final int KEYCODE_RED = 141;

KeyEvent.java中添加的数值要与上面attrs.xml中的数值保持一致,如果是在最后面追加的话,需要注意修改LAST_KEYCODE的值 为最后一个。

7)修改完后,需要在根目录下先执行make update-api更新current.xml(frameworks\base\api目录下)文件,再进行编译,否则会报错。

补充说明:不同的android版本,可能添加的方式不一样,最近在看5.1的时候,发现机制又变了。留意keyevent.java中的注释部分即可。

android修改默认遥控器键值,android 中遥控器键值的添加和修改相关推荐

  1. 如何为neo4j中的【关系】添加or修改【属性】?

    如何为neo4j中的[关系]添加or修改[属性]? 为neo4j中的[关系]添加or修改[属性] 在neo4j中创建包含"一对多"[属性]的[关系] 为neo4j中的[关系]添加o ...

  2. c 表达式必须是可修改的左值_C++中的左值,右值,左值引用,右值引用

    童帅 2020-2-22 文中的"表达式"都是指赋值表达式 左值,右值,左值引用,右值引用 到底是什么 左值和右值 int a = 10; int b = 5; int c = a ...

  3. java布尔值_Java中的布尔值与布尔值

    HUX布斯 我有点扩展了提供的答案(因为到目前为止,他们专注于他们自己的"自己的" /人工术语,侧重于对特定语言进行编程,而不是照顾一般情况下(即当事情发生时)创建编程语言的幕后情 ...

  4. bat修改win8计算机名,技巧:Win7/Win8/Win10下批量添加或修改文件后缀名

    通常我们修改或添加单个文件的后缀名都是通过在文件上右键单击--重命名来完成的,但是如果我们需要修改多个文件的后缀名,这么做显然太繁琐.这时不妨试试Windows的ren(rename)命令,该命令简单 ...

  5. android edittext默认,EditText – 如何在android edittext中设置默认文本

    我正在开发一个 Android应用程序,人们将输入他们的账单. 我有一个EditText,人们输入金额. 我想要做的是例如如果一个人输入"2",它应该自动转换为"0.02 ...

  6. android开机默认打开指定程序,android 开机默认进入指定Launcher

    这里总结下我研究这个需求,想出的两种解决方案. 第一种方法最简单暴力只要修改apk的AndroidManifest直接上源码 这里就加了一句android:priority="2" ...

  7. mysql添加列默认null_MySQL-无法在列中插入NULL值,但是我指定了默认值吗?

    我在MySQL中有一个表,其中有几列具有指定的默认值,但是当我尝试插入行时(未为这些默认列指定值),它抛出一个错误,提示我无法插入NULL值. 这是表格示例: CREATE TABLE `users` ...

  8. android开机默认动画,求一个 android 开机动画的代码

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 @_噢噢 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedIn ...

  9. linux误修改文件名恢复,如何在 Linux 中找出最近或今天被修改的文件-linux修改文件名...

    Linux 用户在命令行上遇到的常见问题之一是定位具有特定名称的文件,如果你知道确定的文件名则可能会容易得假设你忘记了白天早些时候创建的文件的名称(在你包含了数百个文件的 home 文件夹中),但现在 ...

  10. ng-zorro中表格树的动态添加、修改、删除节点操作

    在开发中,有时需要以表格树的形式加载数据,但是数据量特别大时,可能只是先加载一层,如果有子节点就在名称前显示一个"+"号或其它图标,然后点击"+"再展示子节点. ...

最新文章

  1. autodesk许可证服务器,Autodesk软件工作流介绍(十)——配置网络许可服务器的步骤...
  2. stm32l0的停止模式怎么唤醒_探索者 STM32F407 开发板资料连载第二十二章 待机唤醒实验
  3. 为什么使用HashMap需要重写hashcode和equals方法_为什么要重写 hashcode 和 equals 方法?...
  4. QT实现绘制3D基本形状
  5. 请输入星期的第一个字母c语言,C语言经典案例:请输入星期几的第一个字母来判断一下是星期几,...
  6. java什么是接口_Java接口是什么
  7. java学习之Eclipse开发工具
  8. JS:获取字符串中第一个不是汉字的字符
  9. nuc980使用教程--2--spi nor flash(W25Q256)启动
  10. cv :: cvtColor
  11. 体温枪PCBA设计生产流程
  12. 从技术走向管理——李元芳履职记
  13. 读书分享(万历十五年/圆圈正义)
  14. Typora免费版本0.11.18
  15. JMS JMS背景 概述 JMS术语
  16. aeasyexcel 操作 Excel
  17. 深入理解jvm和jvm基本调优参数
  18. [乐意黎原创] 左右格式的3D电影怎么播放
  19. 如何将多个excel表格合并成一个_如何将多个PDF的首页整合成一个单独的PDF
  20. Xilinx Petalinux2019.1开发—环境搭建(一)

热门文章

  1. Windows Server2012远程桌面服务配置和授权激活
  2. 1.vscode 不能运行Python程序,老是显示无法找到文件
  3. C# 教材管理系统(含数据库脚本)
  4. 微型计算机中 运算器的基,微型计算机中,运算器的主要功能是进行()。A.逻辑运算B.算术运算C.算术运算和...
  5. 并联串联混合的电压和电流_中考物理热点1:电荷、电流、电压、串并联电路专题讲解...
  6. 关于u8 u16 u32的含义
  7. ListBox控件—列表控件--常用的属性和方法
  8. 大数据之路—— 数据整合和管理体系
  9. 翁恺《C语言程序设计》(第四版)何钦铭 例题+练习题代码 第八章-指针
  10. 3D打印与3D扫描的未来在哪里