Android下添加新的自定义键值和按键处理流程

    说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我一个问题,请你详细描述一下怎么在Android下添加自定义键值和详细描述下Android的按键处理流程。现在回想起来当时回答的确实不是很好,乘着现在比较空闲的时机就来分析下上述的两个问题。
    首先分析下Android下怎么添加新的自定义键值。在Android的原生系统中键值默认情况下是92个,从0-91;一般情况下,这些键值是够用的,但是如果想扩充的话,还是需要添加新的键值的,那么如何将一个新的键值从驱动的设置映射到上层,使应用可以对我们自定义的键值进行相应的处理呢?
    在介绍Android怎么添加新的键值以前先介绍下Android下INPUT子系统FLOW的流程,下面就是精简的流程图示意图:
    1.添加按键及其映射
    1)如果系统有新的按键需要添加,玛门是怎么添加并上报到系统上层去的呢(这里的上层主要指的是Android应用层),首先要确定的是我们的遥控设备是通过/dev/input目录下那个event调用那个kl文件,这里可以通过如下命令超看cat /proc/bus/input/devices,下面是在终端下的打印信息
  1. <span style=< span="">"font-family:FangSong_GB2312;font-size:18px;">shell@orange:/ # cat /proc/bus/input/devices
  2. I: Bus=0018 Vendor=3697 Product=0001 Version=0001
  3. N: Name="MStar Smart TV IR Receiver"
  4. P: Phys=/dev/ir
  5. S: Sysfs=/devices/virtual/rc/rc0/input0
  6. U: Uniq=
  7. H: Handlers=kbd event0
  8. B: PROP=0
  9. B: EV=13
  10. B: KEY=fc0000 0 fc900 142851 0 0 0 0 108000 1a8 c0000c01 9e37c0 48007 f8000000 10000ffc
  11. B: MSC=10
  12. I: Bus=0000 Vendor=0000 Product=0000 Version=0000
  13. N: Name="MCE IR Keyboard/Mouse (ir)"
  14. P: Phys=/input0
  15. S: Sysfs=/devices/virtual/input/input1
  16. U: Uniq=
  17. H: Handlers=kbd mouse0 event1
  18. B: PROP=0
  19. B: EV=100017
  20. B: KEY=30000 0 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
  21. B: REL=3
  22. B: MSC=10
  23. shell@orange:/ #
  24. shell@orange:/ #
 

通过打印信息我们可以知道,我们的终端设备使用的是Vendor_3697_Product_0001.kl文件,我这里只分析IT遥控设备,那我们的Vendor_3697_Product_0001.kl里面又是啥呢,我们可以通过cat命令查看,具体的信息如下:

  1. <span style=< span="">"font-family:FangSong_GB2312;font-size:18px;"># Copyright (C) 2010 The Android Open Source Project
  2. #
  3. # Licensed under the Apache License, Version 2.0 (the "License");
  4. # you may not use this file except in compliance with the License.
  5. # You may obtain a copy of the License at
  6. #
  7. #      http://www.apache.org/licenses/LICENSE-2.0
  8. #
  9. # Unless required by applicable law or agreed to in writing, software
  10. # distributed under the License is distributed on an "AS IS" BASIS,
  11. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  12. # See the License for the specific language governing permissions and
  13. # limitations under the License.
  14. #
  15. # MStar Smart TV IR Receiver.
  16. #
  17. key 116     POWER                   WAKE
  18. key 11      0
  19. key 2       1
  20. key 3       2
  21. key 4       3
  22. key 5       4
  23. key 6       5
  24. key 7       6
  25. key 8       7
  26. key 9       8
  27. key 10      9
  28. key 398     PROG_RED
  29. key 399     PROG_GREEN
  30. key 400     PROG_YELLOW
  31. key 401     PROG_BLUE
  32. key 103     DPAD_UP
  33. key 108     DPAD_DOWN
  34. key 105     DPAD_LEFT
  35. key 106     DPAD_RIGHT
  36. key 28      ENTER
  37. key 402     CHANNEL_UP              WAKE_DROPPED
  38. key 403     CHANNEL_DOWN            WAKE_DROPPED
  39. key 115     VOLUME_UP               WAKE_DROPPED
  40. key 114     VOLUME_DOWN             WAKE_DROPPED
  41. key 104     PAGE_UP
  42. key 109     PAGE_DOWN
  43. key 102     HOME                    WAKE_DROPPED
  44. key 139     MENU                    WAKE_DROPPED
  45. key 158     BACK
  46. key 113     VOLUME_MUTE
  47. key 167     DVR
  48. key 138     GUIDE
  49. key 358     INFO
  50. #key 82      WINDOW
  51. #key 79      TV_INPUT
  52. key 168     MEDIA_REWIND
  53. key 159     MEDIA_FAST_FORWARD
  54. key 165     MEDIA_PREVIOUS
  55. key 163     MEDIA_NEXT
  56. key 207     MEDIA_PLAY
  57. key 119     MEDIA_PAUSE
  58. key 128     MEDIA_STOP
  59. # Common extended
  60. key 392     SOUND_MODE
  61. key 212     PICTURE_MODE
  62. key 372     ASPECT_RATIO
  63. key 363     CHANNEL_RETURN
  64. key 142     SLEEP
  65. key 365     EPG
  66. key 395     LIST
  67. #key 370     SUBTITLE
  68. key 466     MTS
  69. key 467     FREEZE
  70. key 468     TTX
  71. key 469     CC
  72. key 470     TV_SETTING
  73. key 471     SCREENSHOT
  74. key 356     TV_POWER
  75. # Mstar extended
  76. key 59      MSTAR_BALANCE
  77. key 60      MSTAR_INDEX
  78. key 61      MSTAR_HOLD
  79. key 62      MSTAR_UPDATE
  80. key 63      MSTAR_REVEAL
  81. key 64      MSTAR_SUBCODE
  82. key 65      MSTAR_SIZE
  83. key 66      MSTAR_CLOCK

2)在Vendor_3697_Product_0001.kl文件中添加映射

       key 123 WLS
       说明:
       key -- 是关键字。固定值,不需要改变。
     123 -- 该按键在linux驱动中对应的键值,我在这里只是假设的这个值,至于具体对应的是那个可以查看“include/linux/input.h”
     WLS -- 123按键映射到Android中的按键,它对应是“KeycodeLabels.h”文件中的KEYCODES表格元素的“literal”值。
        其中KeycodeLabels.h的定义如下,我们可以在"MSTAR_PVR_BROWSER", 319后面添加我们需要向Android上层抛的键值,我们这里定义为"WLS", 320,所以当Android上层监听到320的按键值是就是我们新添加的键值了。

Android下添加新的自定义键值和按键处理流程的更多相关文章

  1. Android下添加新的自定义键值和按键处理流程【转】

    本文转载自: Android下添加新的自定义键值和按键处理流程     说出来不怕大家笑话,我写这篇博客的原因在于前几天去一个小公司面试Android系统工程师,然后在面试的时候对方的技术总监问了我一 ...

  2. STL: unordered_map 自定义键值使用

    使用Windows下 RECT 类型做unordered_map 键值 1. Hash 函数 计算自定义类型的hash值. struct hash_RECT { size_t operator()(c ...

  3. Ubuntu下添加新分区并设置挂载点

    Ubuntu下添加新分区并设置挂载点   最近在做Android项目,可是解压根文件系统以后,就报警说硬盘不够.当初设置使用的大小为15G.不过扩展分区还是很方便的.当然首先你得设置添加使用的硬盘大小 ...

  4. map自定义键值类型

    map自定义键值类型 改变Map的默认比较方式 https://www.cnblogs.com/zjfdlut/archive/2011/08/12/2135698.html 大家知道,STL中的ma ...

  5. 痞子衡嵌入式:MCUXpresso IDE下添加新路径下源文件进工程编译的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下添加新路径下源文件进工程编译的方法. 接着上篇文章 <MCUXpresso IDE下SDK工程导入与 ...

  6. std::map使用结构体自定义键值

    使用STL中的map时候,有时候需要使用结构题自定义键值,比如想统计点的坐标出现的次数 struct Node{ int x,y; }; ...... map<Node,int>mp; m ...

  7. 【Android Developers Training】 24. 保存键值对

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. Zabbix的自定义键值和自动发现功能监控Oracle数据库的表空间

    前面介绍了利用Orabbix监控了,参考zabbix通过Orabbix监控oracle数据库,这里我们原先的模板中进行了修改,使用自动发现功能实现监控tablespace的使用情况. 1. 在被监控的 ...

  9. linux系统下添加新硬盘的方法详解

    对于linux新手来说,在linux上添加新硬盘,是很有挑战性的一项工作. 在Linux服务器上把硬盘接好,启动linux,以root登陆. fdisk -l ## 这里是查看目前系统上有几块硬盘 D ...

随机推荐

  1. jQuery( )方法的构建原理

    jQuery中最常用方法的就是jQuery( ),也即$( ). jQuery( )是一个函数调用,调用的结果是返回了一个jQuery实例对象. 编写组件通常的做法是将组件封装成一个对象,需要用的时候 ...

  2. iOS开发中获取WiFi相关信息

    iOS 开发中难免会遇到很多与网络方面的判断,这里做个汇总,大多可能是与WiFi相关的. 1.Ping域名.Ping某IP 有 时候可能会遇到ping 某个域名或者ip通不通,再做下一步操作.这里的p ...

  3. 给Source Insight做个外挂系列之五--Insight “TabSiPlus”

    “TabSiPlus 外挂插件”主要有两部分组成,分别是“外挂插件加载器”和“插件动态库”.“插件动态库”完成Source Insight窗口的Hook,显示Tab标签栏,截获Source Insig ...

  4. MAC emacs下安装php-mode

    在某一个个页面(抱歉不记得了), 比较了三个配置,php-mode, php-mode-improved, xnhtml. 作者在比较后推荐xnhtml,但在xnthml官网下载链接一直显示403,真 ...

  5. android中如何获取xml界面里的非自定义属性

    获取自定义属性大家都很熟悉了,就不多说了(定义declare-styleable,context.obtainStyledAttributes巴拉巴拉...) 下面我们说一下怎么获取非自定义的属性,比 ...

  6. 继续Django

    环境准备 1.    创建一个Django后,Django的目录: │ manage.py │ ├─Django_s1 │ settings.py │ urls.py │ wsgi.py │ __in ...

  7. spark 源码安装

    clone 源码 git clone git://github.com/apache/spark.git maven编译源码 国外镜像比较慢,此处修改maven仓库的镜像为阿里云镜像: <mir ...

  8. Eclipse中配置svn

    1.打开eclipse,help--> Eclipse MarketPlace...,搜索输入“subclipse”,点击安装,一路按向导安装: 2.安装成功后,在Window --> S ...

  9. 解决web浏览器与servlet之间传输数据时出现的乱码问题

    1.使用getParam等方法获取请求参数时遇到乱码 浏览器发送的请求参数使用的编码就是打开网页时使用的编码.如果服务器端获取到发过来的请求参数,默认使用ISO8859-1进行解码操作,中文一定会有乱 ...

  10. web前端基础知识jQuery-补

    一.JS正则 1.定义正则表达式 JavaScript种正则表达式有两种定义方式,定义一个匹配类似 <%XXX%> 的字符串: 1)构造函数 var reg=new RegExp('< ...