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. PHP配置参数

    PHP使用到两个比较重要的配置文件: php.ini:决定php语言运行的环境,支持扩展的模块 , 开发环境的配置.(路径一般位于/etc/php.ini 或 /usr/local/php/etc/p ...

  2. Java多线程之this与Thread.currentThread()的区别——java多线程编程核心技术

      package mythread; public class CountOperate extends Thread{ public CountOperate(){ System.out.prin ...

  3. 【Git学习笔记】初始化Git仓库和版本回退

    学习地址 http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 什么是版本库呢?版本库又 ...

  4. Vue 2.0 + Vue Router + Vuex

    用 Vue.js 2.x 与相配套的 Vue Router.Vuex 搭建了一个最基本的后台管理系统的骨架. 当然先要安装 node.js(包括了 npm).vue-cli 项目结构如图所示: ass ...

  5. django对数据查询结果进行排序的方法

    在你的 Django 应用中,你或许希望根据某字段的值对检索结果排序,比如说,按字母顺序. 那么,使用 order_by() 这个方法就可以搞定了. ? 1 2 >>> Publis ...

  6. erlang ssl

    http://itindex.net/detail/50701-tomcat-bio-nio.apr http://blog.csdn.net/libing1991_/article/details/ ...

  7. 每天进步一点点——五分钟理解一致性哈希算法(consistent hashing)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/23397179     一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT) ...

  8. 【iOS测试】【随笔】帧率FPS评测

    ◆版权声明:本文出自胖喵~的博客,转载必须注明出处. 转载请注明出处:http://www.cnblogs.com/by-dream/p/5943263.html   背景 我们的新版App对首页的列 ...

  9. android studio 2.0 GPU Debugger使用说明

    GPU Debugger GPU Debugging Tools The GPU debugging tools are an experimental feature intended to hel ...

  10. Google Supersonic列存储查询库的介绍、安装、测试

    查询引擎库介绍: http://www.infoq.com/cn/news/2012/10/Google-Supersonic/ Supersonic是一个面向列存储数据库的查询引擎库,它提供了一组数 ...