一、Android输入子系统简介:

  Android输入事件的源头是位于/dev/input/下的设备节点,而输入系统的终点是由WMS管理的某个窗口。最初的输入事件为内核生成的原始事件,而最终交付给窗口的则是KeyEvent或MotionEvent对象。因此Android输入系统的主要工作是读取设备节点中的原始事件,将其加工封装,然后派发给一个特定的窗口以及窗口中的控件。这个过程由InputManagerService(以下简称IMS)系统服务为核心的多个参与者共同完成。

                        图1:输入系统的总体流程与参与者

二、键值映射关系:

    ①IR硬件扫描码在驱动里面被映射为 include/uapi/linux/input.h 里面定义的某个键值,但这个键值只在linux系统(内核)中使用。
  ②Android通过源码目录下的 device/xxx/xxx.kl(keylayout) 文件完成linux键值到Android系统要使用的键值映射。
 
  以HID设备为例,首先内核中的键值转换在drivers/hid/hid-input.c 中进行映射,键值通道也有多种类型,例如:keyboard、consumer 等等;
  //keyboard通道键值则是在如下数组添加修改:
  1. static const unsigned char hid_keyboard[] = {
  2. , , , , , , , , , , , , , , , ,
  3. , , , , , , , , , , , , , , , ,
  4. , , , , , , , , , , , , , , , ,
  5. , , , , , , , , , , , , , , , ,
  6. , , , , , , , ,,,,,,,,,
  7. ,,, , , , , , , , , , , , , ,
  8. , , , , ,,,,,,,,,,,,
  9. ,,,,,,,,,,,,,,,,
  10. ,,unk,unk,unk,,unk, , ,, , , ,unk,unk,unk,
  11. ,, , , ,unk,unk,unk,unk,unk,unk,unk,,unk,unk,unk,
  12. unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
  13. unk,unk,unk,unk,unk,unk,,,unk,unk,unk,unk,unk,unk,unk,unk,
  14. unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,
  15. unk,unk,unk,unk,unk,unk,unk,unk,,unk,unk,unk,unk,unk,unk,unk,
  16. , , ,, , ,,,,,,,,,,,
  17. ,,,,,,,,,,,,unk,unk,unk,unk
  18. };
  19.  
  20. ......
  21.  
  22. //然后在以下代码部分使用:
  23. case HID_UP_KEYBOARD:
  24. set_bit(EV_REP, input->evbit);
  25.  
  26. if ((usage->hid & HID_USAGE) < ) {
  27. if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
  28. map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
  29. } else
  30. map_key(KEY_UNKNOWN);
  31.  
  32. break;

 //consumer通道键值则是在如下添加修改:

  1. case HID_UP_CONSUMER: /* USB HUT v1.12, pages 75-84 */
  2. switch (usage->hid & HID_USAGE) {
  3. case 0x000: goto ignore;
  4. case 0x030: map_key_clear(KEY_POWER); break;
  5. case 0x031: map_key_clear(KEY_RESTART); break;
  6. case 0x032: map_key_clear(KEY_SLEEP); break;
  7. case 0x034: map_key_clear(KEY_SLEEP); break;
  8. case 0x035: map_key_clear(KEY_KBDILLUMTOGGLE); break;
  9. case 0x036: map_key_clear(BTN_MISC); break;
  10. case 0x040: map_key_clear(KEY_MENU); break; /* Menu */
  11. case 0x041: map_key_clear(KEY_SELECT); break; /* Menu Pick */
  12. case 0x042: map_key_clear(KEY_UP); break; /* Menu Up */
  13. case 0x043: map_key_clear(KEY_DOWN); break; /* Menu Down */
  14. case 0x044: map_key_clear(KEY_LEFT); break; /* Menu Left */
  15. case 0x045: map_key_clear(KEY_RIGHT); break; /* Menu Right */
  16. case 0x046: map_key_clear(KEY_ESC); break; /* Menu Escape */
  17. case 0x047: map_key_clear(KEY_KPPLUS); break; /* Menu Value Increase */
  18. case 0x048: map_key_clear(KEY_KPMINUS); break; /* Menu Value Decrease */
  19. case 0x060: map_key_clear(KEY_INFO); break; /* Data On Screen */
  20. case 0x061: map_key_clear(KEY_SUBTITLE); break; /* Closed Caption */
  21. case 0x063: map_key_clear(KEY_VCR); break; /* VCR/TV */
  22. case 0x065: map_key_clear(KEY_CAMERA); break; /* Snapshot */
  23. case 0x069: map_key_clear(KEY_RED); break;
  24. case 0x06a: map_key_clear(KEY_GREEN); break;
  25. case 0x06b: map_key_clear(KEY_BLUE); break;
  26. case 0x06c: map_key_clear(KEY_YELLOW); break;
  27. case 0x06d: map_key_clear(KEY_ZOOM); break;
  28. case 0x082: map_key_clear(KEY_VIDEO_NEXT); break;
  29. case 0x083: map_key_clear(KEY_LAST); break;
  30. case 0x084: map_key_clear(KEY_ENTER); break;
  31. case 0x088: map_key_clear(KEY_PC); break;
  32. case 0x089: map_key_clear(KEY_TV); break;
  33. case 0x08a: map_key_clear(KEY_WWW); break;
  34. case 0x08b: map_key_clear(KEY_DVD); break;
  35. case 0x08c: map_key_clear(KEY_PHONE); break;
  36. case 0x08d: map_key_clear(KEY_PROGRAM); break;
  37. case 0x08e: map_key_clear(KEY_VIDEOPHONE); break;
  38. case 0x08f: map_key_clear(KEY_GAMES); break;
  39. case 0x090: map_key_clear(KEY_MEMO); break;
  40. case 0x091: map_key_clear(KEY_CD); break;
  41. case 0x092: map_key_clear(KEY_VCR); break;
  42. case 0x093: map_key_clear(KEY_TUNER); break;
  43. case 0x094: map_key_clear(KEY_EXIT); break;
  44. case 0x095: map_key_clear(KEY_HELP); break;
  45. case 0x096: map_key_clear(KEY_TAPE); break;
  46. case 0x097: map_key_clear(KEY_TV2); break;
  47. case 0x098: map_key_clear(KEY_SAT); break;
  48. case 0x09a: map_key_clear(KEY_PVR); break;
  49. case 0x09c: map_key_clear(KEY_CHANNELUP); break;
  50. case 0x09d: map_key_clear(KEY_CHANNELDOWN); break;
  51. case 0x0a0: map_key_clear(KEY_VCR2); break;
  52. case 0x0b0: map_key_clear(KEY_PLAY); break;
  53. case 0x0b1: map_key_clear(KEY_PAUSE); break;
  54. case 0x0b2: map_key_clear(KEY_RECORD); break;
  55. case 0x0b3: map_key_clear(KEY_FASTFORWARD); break;
  56. case 0x0b4: map_key_clear(KEY_REWIND); break;
  57. case 0x0b5: map_key_clear(KEY_NEXTSONG); break;
  58. case 0x0b6: map_key_clear(KEY_PREVIOUSSONG); break;
  59. case 0x0b7: map_key_clear(KEY_STOPCD); break;
  60. case 0x0b8: map_key_clear(KEY_EJECTCD); break;
  61. case 0x0bc: map_key_clear(KEY_MEDIA_REPEAT); break;
  62. case 0x0b9: map_key_clear(KEY_SHUFFLE); break;
  63. case 0x0bf: map_key_clear(KEY_SLOW); break;
  64. case 0x0cd: map_key_clear(KEY_PLAYPAUSE); break;
  65. case 0x0e0: map_abs_clear(ABS_VOLUME); break;
  66. case 0x0e2: map_key_clear(KEY_MUTE); break;
  67. case 0x0e5: map_key_clear(KEY_BASSBOOST); break;
  68. case 0x0e9: map_key_clear(KEY_VOLUMEUP); break;
  69. case 0x0ea: map_key_clear(KEY_VOLUMEDOWN); break;
  70. case 0x0f5: map_key_clear(KEY_SLOW); break;
  71. case 0x182: map_key_clear(KEY_BOOKMARKS); break;
  72. case 0x183: map_key_clear(KEY_CONFIG); break;
  73. case 0x184: map_key_clear(KEY_WORDPROCESSOR); break;
  74. case 0x185: map_key_clear(KEY_EDITOR); break;
  75. case 0x186: map_key_clear(KEY_SPREADSHEET); break;
  76. case 0x187: map_key_clear(KEY_GRAPHICSEDITOR); break;
  77. case 0x188: map_key_clear(KEY_PRESENTATION); break;
  78. case 0x189: map_key_clear(KEY_DATABASE); break;
  79. case 0x18a: map_key_clear(KEY_MAIL); break;
  80. case 0x18b: map_key_clear(KEY_NEWS); break;
  81. case 0x18c: map_key_clear(KEY_VOICEMAIL); break;
  82. case 0x18d: map_key_clear(KEY_ADDRESSBOOK); break;
  83. case 0x18e: map_key_clear(KEY_CALENDAR); break;
  84. case 0x191: map_key_clear(KEY_FINANCE); break;
  85. case 0x192: map_key_clear(KEY_CALC); break;
  86. case 0x193: map_key_clear(KEY_PLAYER); break;
  87. case 0x194: map_key_clear(KEY_FILE); break;
  88. case 0x196: map_key_clear(KEY_WWW); break;
  89. case 0x199: map_key_clear(KEY_CHAT); break;
  90. case 0x19c: map_key_clear(KEY_LOGOFF); break;
  91. case 0x19e: map_key_clear(KEY_COFFEE); break;
  92. case 0x1a6: map_key_clear(KEY_HELP); break;
  93. case 0x1a7: map_key_clear(KEY_DOCUMENTS); break;
  94. case 0x1ab: map_key_clear(KEY_SPELLCHECK); break;
  95. case 0x1ae: map_key_clear(KEY_KEYBOARD); break;
  96. case 0x1b6: map_key_clear(KEY_IMAGES); break;
  97. case 0x1b7: map_key_clear(KEY_AUDIO); break;
  98. case 0x1b8: map_key_clear(KEY_VIDEO); break;
  99. case 0x1bc: map_key_clear(KEY_MESSENGER); break;
  100. case 0x1bd: map_key_clear(KEY_INFO); break;
  101. case 0x201: map_key_clear(KEY_NEW); break;
  102. case 0x202: map_key_clear(KEY_OPEN); break;
  103. case 0x203: map_key_clear(KEY_CLOSE); break;
  104. case 0x204: map_key_clear(KEY_EXIT); break;
  105. case 0x207: map_key_clear(KEY_SAVE); break;
  106. case 0x208: map_key_clear(KEY_PRINT); break;
  107. case 0x209: map_key_clear(KEY_PROPS); break;
  108. case 0x21a: map_key_clear(KEY_UNDO); break;
  109. case 0x21b: map_key_clear(KEY_COPY); break;
  110. case 0x21c: map_key_clear(KEY_CUT); break;
  111. case 0x21d: map_key_clear(KEY_PASTE); break;
  112. case 0x21f: map_key_clear(KEY_FIND); break;
  113. case 0x221: map_key_clear(KEY_SEARCH); break;
  114. case 0x222: map_key_clear(KEY_GOTO); break;
  115. case 0x223: map_key_clear(KEY_HOMEPAGE); break;
  116. case 0x224: map_key_clear(KEY_BACK); break;
  117. case 0x225: map_key_clear(KEY_FORWARD); break;
  118. case 0x226: map_key_clear(KEY_STOP); break;
  119. case 0x227: map_key_clear(KEY_REFRESH); break;
  120. case 0x22a: map_key_clear(KEY_BOOKMARKS); break;
  121. case 0x22d: map_key_clear(KEY_ZOOMIN); break;
  122. case 0x22e: map_key_clear(KEY_ZOOMOUT); break;
  123. case 0x22f: map_key_clear(KEY_ZOOMRESET); break;
  124. case 0x233: map_key_clear(KEY_SCROLLUP); break;
  125. case 0x234: map_key_clear(KEY_SCROLLDOWN); break;
  126. case 0x238: map_rel(REL_HWHEEL); break;
  127. case 0x23d: map_key_clear(KEY_EDIT); break;
  128. case 0x25f: map_key_clear(KEY_CANCEL); break;
  129. case 0x269: map_key_clear(KEY_INSERT); break;
  130. case 0x26a: map_key_clear(KEY_DELETE); break;
  131. case 0x279: map_key_clear(KEY_REDO); break;
  132. case 0x289: map_key_clear(KEY_REPLY); break;
  133. case 0x28b: map_key_clear(KEY_FORWARDMAIL); break;
  134. case 0x28c: map_key_clear(KEY_SEND); break;
  135. default: goto ignore;
  136. }
  137. break;

通过 map_key_clear 宏将原始键值(usage->hid & HID_USAGE)转换成内核的定义,映射函数的具体实现可看内核源码,

以上键值的定义在 include/uapi/linux/input-event-codes.h (内核代码,较新版本定义整合进了input.h),对应到Android系统层的头文件则是 bionic/libc/kernel/uapi/linux/input-event-codes.h:

  1. #define KEY_RESERVED 0
  2. #define KEY_ESC 1
  3. #define KEY_1 2
  4. #define KEY_2 3
  5. #define KEY_3 4
  6. #define KEY_4 5
  7. #define KEY_5 6
  8. #define KEY_6 7
  9. #define KEY_7 8
  10. #define KEY_8 9
  11. #define KEY_9 10
  12. #define KEY_0 11
  13. #define KEY_MINUS 12
  14. #define KEY_EQUAL 13
  15. #define KEY_BACKSPACE 14
  16. #define KEY_TAB 15
  17. #define KEY_Q 16
  18. #define KEY_W 17
  19. #define KEY_E 18
  20. #define KEY_R 19
  21. #define KEY_T 20
  22. #define KEY_Y 21
  23. #define KEY_U 22
  24. #define KEY_I 23
  25. #define KEY_O 24
  26. #define KEY_P 25
  27. #define KEY_LEFTBRACE 26
  28. #define KEY_RIGHTBRACE 27
  29. #define KEY_ENTER 28
  30. #define KEY_LEFTCTRL 29
  31. #define KEY_A 30
  32. #define KEY_S 31
  33. #define KEY_D 32
  34. #define KEY_F 33
  35. #define KEY_G 34
  36. #define KEY_H 35
  37. #define KEY_J 36
  38. #define KEY_K 37
  39. #define KEY_L 38
  40. #define KEY_SEMICOLON 39
  41. #define KEY_APOSTROPHE 40
  42. #define KEY_GRAVE 41
  43. #define KEY_LEFTSHIFT 42
  44. #define KEY_BACKSLASH 43
  45. #define KEY_Z 44
  46. #define KEY_X 45
  47. #define KEY_C 46
  48. #define KEY_V 47
  49. #define KEY_B 48
  50. #define KEY_N 49
  51. #define KEY_M 50
  52. #define KEY_COMMA 51
  53. #define KEY_DOT 52
  54. #define KEY_SLASH 53
  55. #define KEY_RIGHTSHIFT 54
  56. #define KEY_KPASTERISK 55
  57. #define KEY_LEFTALT 56
  58. #define KEY_SPACE 57
  59. #define KEY_CAPSLOCK 58
  60. #define KEY_F1 59
  61. #define KEY_F2 60
  62. #define KEY_F3 61
  63. #define KEY_F4 62
  64. #define KEY_F5 63
  65. #define KEY_F6 64
  66. #define KEY_F7 65
  67. #define KEY_F8 66
  68. #define KEY_F9 67
  69. #define KEY_F10 68
  70. #define KEY_NUMLOCK 69
  71. #define KEY_SCROLLLOCK 70
  72. #define KEY_KP7 71
  73. #define KEY_KP8 72
  74. #define KEY_KP9 73
  75. #define KEY_KPMINUS 74
  76. #define KEY_KP4 75
  77. #define KEY_KP5 76
  78. #define KEY_KP6 77
  79. #define KEY_KPPLUS 78
  80. #define KEY_KP1 79
  81. #define KEY_KP2 80
  82. #define KEY_KP3 81
  83. #define KEY_KP0 82
  84. #define KEY_KPDOT 83
  85.  
  86. #define KEY_ZENKAKUHANKAKU 85
  87. #define KEY_102ND 86
  88. #define KEY_F11 87
  89. #define KEY_F12 88
  90. #define KEY_RO 89
  91. #define KEY_KATAKANA 90
  92. #define KEY_HIRAGANA 91
  93. #define KEY_HENKAN 92
  94. #define KEY_KATAKANAHIRAGANA 93
  95. #define KEY_MUHENKAN 94
  96. #define KEY_KPJPCOMMA 95
  97. #define KEY_KPENTER 96
  98. #define KEY_RIGHTCTRL 97
  99. #define KEY_KPSLASH 98
  100. #define KEY_SYSRQ 99
  101. #define KEY_RIGHTALT 100
  102. #define KEY_LINEFEED 101
  103. #define KEY_HOME 102
  104. #define KEY_UP 103
  105. #define KEY_PAGEUP 104
  106. #define KEY_LEFT 105
  107. #define KEY_RIGHT 106
  108. #define KEY_END 107
  109. #define KEY_DOWN 108
  110. #define KEY_PAGEDOWN 109
  111. #define KEY_INSERT 110
  112. #define KEY_DELETE 111
  113. #define KEY_MACRO 112
  114. #define KEY_MUTE 113
  115. #define KEY_VOLUMEDOWN 114
  116. #define KEY_VOLUMEUP 115
  117. #define KEY_POWER 116 /* SC System Power Down */
  118. #define KEY_KPEQUAL 117
  119. #define KEY_KPPLUSMINUS 118
  120. #define KEY_PAUSE 119
  121. #define KEY_SCALE 120 /* AL Compiz Scale (Expose) */
  122.  
  123. #define KEY_KPCOMMA 121
  124. #define KEY_HANGEUL 122
  125. #define KEY_HANGUEL KEY_HANGEUL
  126. #define KEY_HANJA 123
  127. #define KEY_YEN 124
  128. #define KEY_LEFTMETA 125
  129. #define KEY_RIGHTMETA 126
  130. #define KEY_COMPOSE 127
  131.  
  132. #define KEY_STOP 128 /* AC Stop */
  133. #define KEY_AGAIN 129
  134. #define KEY_PROPS 130 /* AC Properties */
  135. #define KEY_UNDO 131 /* AC Undo */
  136. #define KEY_FRONT 132
  137. #define KEY_COPY 133 /* AC Copy */
  138. #define KEY_OPEN 134 /* AC Open */
  139. #define KEY_PASTE 135 /* AC Paste */
  140. #define KEY_FIND 136 /* AC Search */
  141. #define KEY_CUT 137 /* AC Cut */
  142. #define KEY_HELP 138 /* AL Integrated Help Center */
  143. #define KEY_MENU 139 /* Menu (show menu) */
  144. #define KEY_CALC 140 /* AL Calculator */
  145. #define KEY_SETUP 141
  146. #define KEY_SLEEP 142 /* SC System Sleep */
  147. #define KEY_WAKEUP 143 /* System Wake Up */
  148. #define KEY_FILE 144 /* AL Local Machine Browser */
  149. #define KEY_SENDFILE 145
  150. #define KEY_DELETEFILE 146
  151. #define KEY_XFER 147
  152. #define KEY_PROG1 148
  153. #define KEY_PROG2 149
  154. #define KEY_WWW 150 /* AL Internet Browser */
  155. #define KEY_MSDOS 151
  156. #define KEY_COFFEE 152 /* AL Terminal Lock/Screensaver */
  157. #define KEY_SCREENLOCK KEY_COFFEE
  158. #define KEY_DIRECTION 153
  159. #define KEY_CYCLEWINDOWS 154
  160. #define KEY_MAIL 155
  161. #define KEY_BOOKMARKS 156 /* AC Bookmarks */
  162. #define KEY_COMPUTER 157
  163. #define KEY_BACK 158 /* AC Back */
  164. #define KEY_FORWARD 159 /* AC Forward */
  165. #define KEY_CLOSECD 160
  166. #define KEY_EJECTCD 161
  167. #define KEY_EJECTCLOSECD 162
  168. #define KEY_NEXTSONG 163
  169. #define KEY_PLAYPAUSE 164
  170. #define KEY_PREVIOUSSONG 165
  171. #define KEY_STOPCD 166
  172. #define KEY_RECORD 167
  173. #define KEY_REWIND 168
  174. #define KEY_PHONE 169 /* Media Select Telephone */
  175. #define KEY_ISO 170
  176. #define KEY_CONFIG 171 /* AL Consumer Control Configuration */
  177. #define KEY_HOMEPAGE 172 /* AC Home */
  178. #define KEY_REFRESH 173 /* AC Refresh */
  179. #define KEY_EXIT 174 /* AC Exit */
  180. #define KEY_MOVE 175
  181. #define KEY_EDIT 176
  182. #define KEY_SCROLLUP 177
  183. #define KEY_SCROLLDOWN 178
  184. #define KEY_KPLEFTPAREN 179
  185. #define KEY_KPRIGHTPAREN 180
  186. #define KEY_NEW 181 /* AC New */
  187. #define KEY_REDO 182 /* AC Redo/Repeat */
  188.  
  189. #define KEY_F13 183
  190. #define KEY_F14 184
  191. #define KEY_F15 185
  192. #define KEY_F16 186
  193. #define KEY_F17 187
  194. #define KEY_F18 188
  195. #define KEY_F19 189
  196. #define KEY_F20 190
  197. #define KEY_F21 191
  198. #define KEY_F22 192
  199. #define KEY_F23 193
  200. #define KEY_F24 194
  201.  
  202. #define KEY_PLAYCD 200
  203. #define KEY_PAUSECD 201
  204. #define KEY_PROG3 202
  205. #define KEY_PROG4 203
  206. #define KEY_DASHBOARD 204 /* AL Dashboard */
  207. #define KEY_SUSPEND 205
  208. #define KEY_CLOSE 206 /* AC Close */
  209. #define KEY_PLAY 207
  210. #define KEY_FASTFORWARD 208
  211. #define KEY_BASSBOOST 209
  212. #define KEY_PRINT 210 /* AC Print */
  213. #define KEY_HP 211
  214. #define KEY_CAMERA 212
  215. #define KEY_SOUND 213
  216. #define KEY_QUESTION 214
  217. #define KEY_EMAIL 215
  218. #define KEY_CHAT 216
  219. #define KEY_SEARCH 217
  220. #define KEY_CONNECT 218
  221. #define KEY_FINANCE 219 /* AL Checkbook/Finance */
  222. #define KEY_SPORT 220
  223. #define KEY_SHOP 221
  224. #define KEY_ALTERASE 222
  225. #define KEY_CANCEL 223 /* AC Cancel */
  226. #define KEY_BRIGHTNESSDOWN 224
  227. #define KEY_BRIGHTNESSUP 225
  228. #define KEY_MEDIA 226
  229.  
  230. #define KEY_SWITCHVIDEOMODE 227 /* Cycle between available video
  231. outputs (Monitor/LCD/TV-out/etc) */
  232. #define KEY_KBDILLUMTOGGLE 228
  233. #define KEY_KBDILLUMDOWN 229
  234. #define KEY_KBDILLUMUP 230
  235.  
  236. #define KEY_SEND 231 /* AC Send */
  237. #define KEY_REPLY 232 /* AC Reply */
  238. #define KEY_FORWARDMAIL 233 /* AC Forward Msg */
  239. #define KEY_SAVE 234 /* AC Save */
  240. #define KEY_DOCUMENTS 235
  241.  
  242. #define KEY_BATTERY 236
  243.  
  244. #define KEY_BLUETOOTH 237
  245. #define KEY_WLAN 238
  246. #define KEY_UWB 239
  247.  
  248. #define KEY_UNKNOWN 240
  249.  
  250. #define KEY_VIDEO_NEXT 241 /* drive next video source */
  251. #define KEY_VIDEO_PREV 242 /* drive previous video source */
  252. #define KEY_BRIGHTNESS_CYCLE 243 /* brightness up, after max is min */
  253. #define KEY_BRIGHTNESS_AUTO 244 /* Set Auto Brightness: manual
  254. brightness control is off,
  255. rely on ambient */
  256. #define KEY_BRIGHTNESS_ZERO KEY_BRIGHTNESS_AUTO
  257. #define KEY_DISPLAY_OFF 245 /* display device to off state */
  258.  
  259. #define KEY_WWAN 246 /* Wireless WAN (LTE, UMTS, GSM, etc.) */
  260. #define KEY_WIMAX KEY_WWAN
  261. #define KEY_RFKILL 247 /* Key that controls all radios */
  262.  
  263. #define KEY_MICMUTE 248 /* Mute / unmute the microphone */
  264.  
  265. /* Code 255 is reserved for special needs of AT keyboard driver */
 
可通过 getevent 指令查看上报的键值,键值为十六进制显示:
 

  首先要确定按键输入设备是对应/dev/input目录下哪个event,根据VID PID匹配对应的kl文件,可通过如下命令 cat /proc/bus/input/devices 查看设备信息:

  1. shell@flo:/ $ cat /proc/bus/input/devices
  2. I: Bus= Vendor= Product= Version=
  3. N: Name="elan-touchscreen"
  4. P: Phys=
  5. S: Sysfs=/devices/virtual/input/input0
  6. U: Uniq=
  7. H: Handlers=event0 cpufreq
  8. B: PROP=
  9. B: EV=b
  10. B: KEY=
  11. B: ABS=
  12.  
  13. I: Bus= Vendor= Product= Version=
  14. N: Name="lid_input"
  15. P: Phys=/dev/input/lid_indev
  16. S: Sysfs=/devices/virtual/input/input1
  17. U: Uniq=
  18. H: Handlers=event1 cpufreq
  19. B: PROP=
  20. B: EV=
  21. B: SW=
  22.  
  23. I: Bus= Vendor= Product= Version=
  24. N: Name="apq8064-tabla-snd-card Button Jack"
  25. P: Phys=ALSA
  26. S: Sysfs=/devices/platform/soc-audio./sound/card0/input2
  27. U: Uniq=
  28. H: Handlers=event2 cpufreq
  29. B: PROP=
  30. B: EV=
  31. B: KEY=ff
  32.  
  33. I: Bus= Vendor= Product= Version=
  34. N: Name="apq8064-tabla-snd-card Headset Jack"
  35. P: Phys=ALSA
  36. S: Sysfs=/devices/platform/soc-audio./sound/card0/input3
  37. U: Uniq=
  38. H: Handlers=event3 cpufreq
  39. B: PROP=
  40. B: EV=
  41. B: SW=1c054
  42.  
  43. I: Bus= Vendor= Product= Version=
  44. N: Name="h2w button"
  45. P: Phys=
  46. S: Sysfs=/devices/virtual/input/input4
  47. U: Uniq=
  48. H: Handlers=kbd event4 cpufreq
  49. B: PROP=
  50. B: EV=
  51. B: KEY=
  52.  
  53. I: Bus= Vendor= Product= Version=
  54. N: Name="gpio-keys"
  55. P: Phys=gpio-keys/input0
  56. S: Sysfs=/devices/platform/gpio-keys./input/input5
  57. U: Uniq=
  58. H: Handlers=kbd event5 keychord cpufreq
  59. B: PROP=
  60. B: EV=
  61. B: KEY=1c0000
  62.  
  63. I: Bus= Vendor= Product=001D Version=
  64. N: Name="Smart Remote"
  65. P: Phys=
  66. S: Sysfs=/devices/virtual/misc/uhid/input7
  67. U: Uniq=
  68. H: Handlers=sysrq kbd event6 keychord cpufreq
  69. B: PROP=
  70. B: EV=10001f
  71. B: KEY=4837fff 72ff32d bf544446 30f90 8b17c007 ffff7bfa d9415fff febeffdf ffefffff ffffffff fffffffe
  72. B: REL=
  73. B: ABS=
  74. B: MSC=

  如上我的设备名是:"Smart Remote"  , VID PID信息是:Vendor=0030 Product=001D ,则对应 /system/usr/keylayout/Vendor_0030_Product_001D.kl,如果该目录下没有对应VID PID的.kl则默认使用 Generic.kl,根据系统差异可能另外有 /data/system/devices/keylayout/Vendor_XXXX_Product_XXXX_Version_XXXX.kl ,此外还有键值对应字符的转换表:/system/usr/keychars/Generic.kcm 。

所以上面通过getevent获得的原始键值是0x44(十进制:68),然后由 hid-input.c 可知 hid_keyboard[68]=87 而 input.h 中定义是 #define KEY_F11 87,所以Android系统层获取到内核转换后的键值为<87>,然后通过加载Generic.kl解析<87>的含义是"F11"(一般都是和内核头文件定义相匹配,也可以自己修改使其映射成其他含义):

  1. #
  2. # Generic key layout file for full alphabetic US English PC style external keyboards.
  3. #
  4. # This file is intentionally very generic and is intended to support a broad rang of keyboards.
  5. # Do not edit the generic key layout to support a specific keyboard; instead, create
  6. # a new key layout file with the required keyboard configuration.
  7. #
  8.  
  9. key ESCAPE
  10. key
  11. key
  12. key
  13. key
  14. key
  15. key
  16. key
  17. key
  18. key
  19. key
  20. key MINUS
  21. key EQUALS
  22. key DEL
  23. key TAB
  24. key Q
  25. key W
  26. key E
  27. key R
  28. key T
  29. key Y
  30. key U
  31. key I
  32. key O
  33. key P
  34. key LEFT_BRACKET
  35. key RIGHT_BRACKET
  36. key ENTER
  37. key CTRL_LEFT
  38. key A
  39. key S
  40. key D
  41. key F
  42. key G
  43. key H
  44. key J
  45. key K
  46. key L
  47. key SEMICOLON
  48. key APOSTROPHE
  49. key GRAVE
  50. key SHIFT_LEFT
  51. key BACKSLASH
  52. key Z
  53. key X
  54. key C
  55. key V
  56. key B
  57. key N
  58. key M
  59. key COMMA
  60. key PERIOD
  61. key SLASH
  62. key SHIFT_RIGHT
  63. key NUMPAD_MULTIPLY
  64. key ALT_LEFT
  65. key SPACE
  66. key CAPS_LOCK
  67. key F1
  68. key F2
  69. key F3
  70. key F4
  71. key F5
  72. key F6
  73. key F7
  74. key F8
  75. key F9
  76. key F10
  77. key NUM_LOCK
  78. key SCROLL_LOCK
  79. key NUMPAD_7
  80. key NUMPAD_8
  81. key NUMPAD_9
  82. key NUMPAD_SUBTRACT
  83. key NUMPAD_4
  84. key NUMPAD_5
  85. key NUMPAD_6
  86. key NUMPAD_ADD
  87. key NUMPAD_1
  88. key NUMPAD_2
  89. key NUMPAD_3
  90. key NUMPAD_0
  91. key NUMPAD_DOT
  92. # key (undefined)
  93. key ZENKAKU_HANKAKU
  94. key BACKSLASH
  95. key F11
  96. key F12
  97. key RO
  98. # key "KEY_KATAKANA"
  99. # key "KEY_HIRAGANA"
  100. key HENKAN
  101. key KATAKANA_HIRAGANA
  102. key MUHENKAN
  103. key NUMPAD_COMMA
  104. key NUMPAD_ENTER
  105. key CTRL_RIGHT
  106. key NUMPAD_DIVIDE
  107. key SYSRQ
  108. key ALT_RIGHT
  109. # key "KEY_LINEFEED"
  110. key MOVE_HOME
  111. key DPAD_UP
  112. key PAGE_UP
  113. key DPAD_LEFT
  114. key DPAD_RIGHT
  115. key MOVE_END
  116. key DPAD_DOWN
  117. key PAGE_DOWN
  118. key INSERT
  119. key FORWARD_DEL
  120. # key "KEY_MACRO"
  121. key VOLUME_MUTE
  122. key VOLUME_DOWN
  123. key VOLUME_UP
  124. key POWER WAKE
  125. key NUMPAD_EQUALS
  126. # key "KEY_KPPLUSMINUS"
  127. key BREAK
  128. # key (undefined)
  129. key NUMPAD_COMMA
  130. key KANA
  131. key EISU
  132. key YEN
  133. key META_LEFT
  134. key META_RIGHT
  135. key MENU WAKE_DROPPED
  136. key MEDIA_STOP
  137. # key "KEY_AGAIN"
  138. # key "KEY_PROPS"
  139. # key "KEY_UNDO"
  140. # key "KEY_FRONT"
  141. # key "KEY_COPY"
  142. # key "KEY_OPEN"
  143. # key "KEY_PASTE"
  144. # key "KEY_FIND"
  145. # key "KEY_CUT"
  146. # key "KEY_HELP"
  147. key MENU WAKE_DROPPED
  148. key CALCULATOR
  149. # key "KEY_SETUP"
  150. key POWER WAKE
  151. key POWER WAKE
  152. # key "KEY_FILE"
  153. # key "KEY_SENDFILE"
  154. # key "KEY_DELETEFILE"
  155. # key "KEY_XFER"
  156. # key "KEY_PROG1"
  157. # key "KEY_PROG2"
  158. key EXPLORER
  159. # key "KEY_MSDOS"
  160. key POWER WAKE
  161. # key "KEY_DIRECTION"
  162. # key "KEY_CYCLEWINDOWS"
  163. key ENVELOPE
  164. key BOOKMARK
  165. # key "KEY_COMPUTER"
  166. key BACK WAKE_DROPPED
  167. key FORWARD
  168. key MEDIA_CLOSE
  169. key MEDIA_EJECT
  170. key MEDIA_EJECT
  171. key MEDIA_NEXT
  172. key MEDIA_PLAY_PAUSE
  173. key MEDIA_PREVIOUS
  174. key MEDIA_STOP
  175. key MEDIA_RECORD
  176. key MEDIA_REWIND
  177. key CALL
  178. # key "KEY_ISO"
  179. key MUSIC
  180. key HOME
  181. # key "KEY_REFRESH"
  182. # key "KEY_EXIT"
  183. # key "KEY_MOVE"
  184. # key "KEY_EDIT"
  185. key PAGE_UP
  186. key PAGE_DOWN
  187. key NUMPAD_LEFT_PAREN
  188. key NUMPAD_RIGHT_PAREN
  189. # key "KEY_NEW"
  190. # key "KEY_REDO"
  191. # key F13
  192. # key F14
  193. # key F15
  194. # key F16
  195. # key F17
  196. # key F18
  197. # key F19
  198. # key F20
  199. # key F21
  200. # key F22
  201. # key F23
  202. # key F24
  203. # key (undefined)
  204. # key (undefined)
  205. # key (undefined)
  206. # key (undefined)
  207. # key (undefined)
  208. key MEDIA_PLAY
  209. key MEDIA_PAUSE
  210. # key "KEY_PROG3"
  211. # key "KEY_PROG4"
  212. # key (undefined)
  213. # key "KEY_SUSPEND"
  214. # key "KEY_CLOSE"
  215. key MEDIA_PLAY
  216. key MEDIA_FAST_FORWARD
  217. # key "KEY_BASSBOOST"
  218. # key "KEY_PRINT"
  219. # key "KEY_HP"
  220. key CAMERA
  221. key MUSIC
  222. # key "KEY_QUESTION"
  223. key ENVELOPE
  224. # key "KEY_CHAT"
  225. key SEARCH
  226. # key "KEY_CONNECT"
  227. # key "KEY_FINANCE"
  228. # key "KEY_SPORT"
  229. # key "KEY_SHOP"
  230. # key "KEY_ALTERASE"
  231. # key "KEY_CANCEL"
  232. key BRIGHTNESS_DOWN
  233. key BRIGHTNESS_UP
  234. key HEADSETHOOK
  235.  
  236. key BUTTON_1
  237. key BUTTON_2
  238. key BUTTON_3
  239. key BUTTON_4
  240. key BUTTON_5
  241. key BUTTON_6
  242. key BUTTON_7
  243. key BUTTON_8
  244. key BUTTON_9
  245. key BUTTON_10
  246. key BUTTON_11
  247. key BUTTON_12
  248. key BUTTON_13
  249. key BUTTON_14
  250. key BUTTON_15
  251. key BUTTON_16
  252.  
  253. key BUTTON_1
  254. key BUTTON_2
  255. key BUTTON_3
  256. key BUTTON_4
  257. key BUTTON_5
  258. key BUTTON_6
  259. key BUTTON_7
  260. key BUTTON_8
  261. key BUTTON_9
  262. key BUTTON_10
  263. key BUTTON_11
  264. key BUTTON_12
  265. key BUTTON_13
  266. key BUTTON_14
  267. key BUTTON_15
  268. key BUTTON_16
  269.  
  270. key BUTTON_A
  271. key BUTTON_B
  272. key BUTTON_C
  273. key BUTTON_X
  274. key BUTTON_Y
  275. key BUTTON_Z
  276. key BUTTON_L1
  277. key BUTTON_R1
  278. key BUTTON_L2
  279. key BUTTON_R2
  280. key BUTTON_SELECT
  281. key BUTTON_START
  282. key BUTTON_MODE
  283. key BUTTON_THUMBL
  284. key BUTTON_THUMBR
  285.  
  286. # key "KEY_OK"
  287. key DPAD_CENTER
  288. # key "KEY_GOTO"
  289. # key "KEY_CLEAR"
  290. # key "KEY_POWER2"
  291. # key "KEY_OPTION"
  292. # key "KEY_INFO"
  293. # key "KEY_TIME"
  294. # key "KEY_VENDOR"
  295. # key "KEY_ARCHIVE"
  296. key GUIDE
  297. # key "KEY_CHANNEL"
  298. # key "KEY_FAVORITES"
  299. # key "KEY_EPG"
  300. key DVR
  301. # key "KEY_MHP"
  302. # key "KEY_LANGUAGE"
  303. # key "KEY_TITLE"
  304. # key "KEY_SUBTITLE"
  305. # key "KEY_ANGLE"
  306. # key "KEY_ZOOM"
  307. # key "KEY_MODE"
  308. # key "KEY_KEYBOARD"
  309. # key "KEY_SCREEN"
  310. # key "KEY_PC"
  311. key TV
  312. # key "KEY_TV2"
  313. # key "KEY_VCR"
  314. # key "KEY_VCR2"
  315. # key "KEY_SAT"
  316. # key "KEY_SAT2"
  317. # key "KEY_CD"
  318. # key "KEY_TAPE"
  319. # key "KEY_RADIO"
  320. # key "KEY_TUNER"
  321. # key "KEY_PLAYER"
  322. # key "KEY_TEXT"
  323. # key "KEY_DVD"
  324. # key "KEY_AUX"
  325. # key "KEY_MP3"
  326. # key "KEY_AUDIO"
  327. # key "KEY_VIDEO"
  328. # key "KEY_DIRECTORY"
  329. # key "KEY_LIST"
  330. # key "KEY_MEMO"
  331. key CALENDAR
  332. # key "KEY_RED"
  333. # key "KEY_GREEN"
  334. # key "KEY_YELLOW"
  335. # key "KEY_BLUE"
  336. key CHANNEL_UP
  337. key CHANNEL_DOWN
  338. # key "KEY_FIRST"
  339. # key "KEY_LAST"
  340. # key "KEY_AB"
  341. # key "KEY_NEXT"
  342. # key "KEY_RESTART"
  343. # key "KEY_SLOW"
  344. # key "KEY_SHUFFLE"
  345. # key "KEY_BREAK"
  346. # key "KEY_PREVIOUS"
  347. # key "KEY_DIGITS"
  348. # key "KEY_TEEN"
  349. # key "KEY_TWEN"
  350.  
  351. key CONTACTS
  352.  
  353. # key "KEY_DEL_EOL"
  354. # key "KEY_DEL_EOS"
  355. # key "KEY_INS_LINE"
  356. # key "KEY_DEL_LINE"
  357.  
  358. key FUNCTION
  359. key ESCAPE FUNCTION
  360. key F1 FUNCTION
  361. key F2 FUNCTION
  362. key F3 FUNCTION
  363. key F4 FUNCTION
  364. key F5 FUNCTION
  365. key F6 FUNCTION
  366. key F7 FUNCTION
  367. key F8 FUNCTION
  368. key F9 FUNCTION
  369. key F10 FUNCTION
  370. key F11 FUNCTION
  371. key F12 FUNCTION
  372. key FUNCTION
  373. key FUNCTION
  374. key D FUNCTION
  375. key E FUNCTION
  376. key F FUNCTION
  377. key S FUNCTION
  378. key B FUNCTION
  379.  
  380. # key KEY_BRL_DOT1
  381. # key KEY_BRL_DOT2
  382. # key KEY_BRL_DOT3
  383. # key KEY_BRL_DOT4
  384. # key KEY_BRL_DOT5
  385. # key KEY_BRL_DOT6
  386. # key KEY_BRL_DOT7
  387. # key KEY_BRL_DOT8
  388.  
  389. # Keys defined by HID usages
  390. key usage 0x0c006F BRIGHTNESS_UP
  391. key usage 0x0c0070 BRIGHTNESS_DOWN
  392.  
  393. # Joystick and game controller axes.
  394. # Axes that are not mapped will be assigned generic axis numbers by the input subsystem.
  395. axis 0x00 X
  396. axis 0x01 Y
  397. axis 0x02 Z
  398. axis 0x03 RX
  399. axis 0x04 RY
  400. axis 0x05 RZ
  401. axis 0x06 THROTTLE
  402. axis 0x07 RUDDER
  403. axis 0x08 WHEEL
  404. axis 0x09 GAS
  405. axis 0x0a BRAKE
  406. axis 0x10 HAT_X
  407. axis 0x11 HAT_Y

键值从底层上报到上层的流程简图如下:

      图2:键值上报流程

  从上图可以看到,framework层通过.kl文件将获取的键值转换成实际按键含义后,又会通过KeycodeLabel转换成相应的keycode,具体文件在:frameworks\native\include\input\KeycodeLabels.h(android 4.4.4源码):

  1. /*
  2. * Copyright (C) 2008 The Android Open Source Project
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16.  
  17. #ifndef _LIBINPUT_KEYCODE_LABELS_H
  18. #define _LIBINPUT_KEYCODE_LABELS_H
  19.  
  20. #include <android/keycodes.h>
  21.  
  22. struct KeycodeLabel {
  23. const char *literal;
  24. int value;
  25. };
  26.  
  27. static const KeycodeLabel KEYCODES[] = {
  28. { "SOFT_LEFT", },
  29. { "SOFT_RIGHT", },
  30. { "HOME", },
  31. { "BACK", },
  32. { "CALL", },
  33. { "ENDCALL", },
  34. { "", },
  35. { "", },
  36. { "", },
  37. { "", },
  38. { "", },
  39. { "", },
  40. { "", },
  41. { "", },
  42. { "", },
  43. { "", },
  44. { "STAR", },
  45. { "POUND", },
  46. { "DPAD_UP", },
  47. { "DPAD_DOWN", },
  48. { "DPAD_LEFT", },
  49. { "DPAD_RIGHT", },
  50. { "DPAD_CENTER", },
  51. { "VOLUME_UP", },
  52. { "VOLUME_DOWN", },
  53. { "POWER", },
  54. { "CAMERA", },
  55. { "CLEAR", },
  56. { "A", },
  57. { "B", },
  58. { "C", },
  59. { "D", },
  60. { "E", },
  61. { "F", },
  62. { "G", },
  63. { "H", },
  64. { "I", },
  65. { "J", },
  66. { "K", },
  67. { "L", },
  68. { "M", },
  69. { "N", },
  70. { "O", },
  71. { "P", },
  72. { "Q", },
  73. { "R", },
  74. { "S", },
  75. { "T", },
  76. { "U", },
  77. { "V", },
  78. { "W", },
  79. { "X", },
  80. { "Y", },
  81. { "Z", },
  82. { "COMMA", },
  83. { "PERIOD", },
  84. { "ALT_LEFT", },
  85. { "ALT_RIGHT", },
  86. { "SHIFT_LEFT", },
  87. { "SHIFT_RIGHT", },
  88. { "TAB", },
  89. { "SPACE", },
  90. { "SYM", },
  91. { "EXPLORER", },
  92. { "ENVELOPE", },
  93. { "ENTER", },
  94. { "DEL", },
  95. { "GRAVE", },
  96. { "MINUS", },
  97. { "EQUALS", },
  98. { "LEFT_BRACKET", },
  99. { "RIGHT_BRACKET", },
  100. { "BACKSLASH", },
  101. { "SEMICOLON", },
  102. { "APOSTROPHE", },
  103. { "SLASH", },
  104. { "AT", },
  105. { "NUM", },
  106. { "HEADSETHOOK", },
  107. { "FOCUS", },
  108. { "PLUS", },
  109. { "MENU", },
  110. { "NOTIFICATION", },
  111. { "SEARCH", },
  112. { "MEDIA_PLAY_PAUSE", },
  113. { "MEDIA_STOP", },
  114. { "MEDIA_NEXT", },
  115. { "MEDIA_PREVIOUS", },
  116. { "MEDIA_REWIND", },
  117. { "MEDIA_FAST_FORWARD", },
  118. { "MUTE", },
  119. { "PAGE_UP", },
  120. { "PAGE_DOWN", },
  121. { "PICTSYMBOLS", },
  122. { "SWITCH_CHARSET", },
  123. { "BUTTON_A", },
  124. { "BUTTON_B", },
  125. { "BUTTON_C", },
  126. { "BUTTON_X", },
  127. { "BUTTON_Y", },
  128. { "BUTTON_Z", },
  129. { "BUTTON_L1", },
  130. { "BUTTON_R1", },
  131. { "BUTTON_L2", },
  132. { "BUTTON_R2", },
  133. { "BUTTON_THUMBL", },
  134. { "BUTTON_THUMBR", },
  135. { "BUTTON_START", },
  136. { "BUTTON_SELECT", },
  137. { "BUTTON_MODE", },
  138. { "ESCAPE", },
  139. { "FORWARD_DEL", },
  140. { "CTRL_LEFT", },
  141. { "CTRL_RIGHT", },
  142. { "CAPS_LOCK", },
  143. { "SCROLL_LOCK", },
  144. { "META_LEFT", },
  145. { "META_RIGHT", },
  146. { "FUNCTION", },
  147. { "SYSRQ", },
  148. { "BREAK", },
  149. { "MOVE_HOME", },
  150. { "MOVE_END", },
  151. { "INSERT", },
  152. { "FORWARD", },
  153. { "MEDIA_PLAY", },
  154. { "MEDIA_PAUSE", },
  155. { "MEDIA_CLOSE", },
  156. { "MEDIA_EJECT", },
  157. { "MEDIA_RECORD", },
  158. { "F1", },
  159. { "F2", },
  160. { "F3", },
  161. { "F4", },
  162. { "F5", },
  163. { "F6", },
  164. { "F7", },
  165. { "F8", },
  166. { "F9", },
  167. { "F10", },
  168. //{ "F11", 141 },
  169. { "F11", },
  170. { "F12", },
  171. { "NUM_LOCK", },
  172. { "NUMPAD_0", },
  173. { "NUMPAD_1", },
  174. { "NUMPAD_2", },
  175. { "NUMPAD_3", },
  176. { "NUMPAD_4", },
  177. { "NUMPAD_5", },
  178. { "NUMPAD_6", },
  179. { "NUMPAD_7", },
  180. { "NUMPAD_8", },
  181. { "NUMPAD_9", },
  182. { "NUMPAD_DIVIDE", },
  183. { "NUMPAD_MULTIPLY", },
  184. { "NUMPAD_SUBTRACT", },
  185. { "NUMPAD_ADD", },
  186. { "NUMPAD_DOT", },
  187. { "NUMPAD_COMMA", },
  188. { "NUMPAD_ENTER", },
  189. { "NUMPAD_EQUALS", },
  190. { "NUMPAD_LEFT_PAREN", },
  191. { "NUMPAD_RIGHT_PAREN", },
  192. { "VOLUME_MUTE", },
  193. { "INFO", },
  194. { "CHANNEL_UP", },
  195. { "CHANNEL_DOWN", },
  196. { "ZOOM_IN", },
  197. { "ZOOM_OUT", },
  198. { "TV", },
  199. { "WINDOW", },
  200. { "GUIDE", },
  201. { "DVR", },
  202. { "BOOKMARK", },
  203. { "CAPTIONS", },
  204. { "SETTINGS", },
  205. { "TV_POWER", },
  206. { "TV_INPUT", },
  207. { "STB_POWER", },
  208. { "STB_INPUT", },
  209. { "AVR_POWER", },
  210. { "AVR_INPUT", },
  211. { "PROG_RED", },
  212. { "PROG_GREEN", },
  213. { "PROG_YELLOW", },
  214. { "PROG_BLUE", },
  215. { "APP_SWITCH", },
  216. { "BUTTON_1", },
  217. { "BUTTON_2", },
  218. { "BUTTON_3", },
  219. { "BUTTON_4", },
  220. { "BUTTON_5", },
  221. { "BUTTON_6", },
  222. { "BUTTON_7", },
  223. { "BUTTON_8", },
  224. { "BUTTON_9", },
  225. { "BUTTON_10", },
  226. { "BUTTON_11", },
  227. { "BUTTON_12", },
  228. { "BUTTON_13", },
  229. { "BUTTON_14", },
  230. { "BUTTON_15", },
  231. { "BUTTON_16", },
  232. { "LANGUAGE_SWITCH", },
  233. { "MANNER_MODE", },
  234. { "3D_MODE", },
  235. { "CONTACTS", },
  236. { "CALENDAR", },
  237. { "MUSIC", },
  238. { "CALCULATOR", },
  239. { "ZENKAKU_HANKAKU", },
  240. { "EISU", },
  241. { "MUHENKAN", },
  242. { "HENKAN", },
  243. { "KATAKANA_HIRAGANA", },
  244. { "YEN", },
  245. { "RO", },
  246. { "KANA", },
  247. { "ASSIST", },
  248. { "BRIGHTNESS_DOWN", },
  249. { "BRIGHTNESS_UP", },
  250. { "MEDIA_AUDIO_TRACK", },
  251.  
  252. // NOTE: If you add a new keycode here you must also add it to several other files.
  253. // Refer to frameworks/base/core/java/android/view/KeyEvent.java for the full list.
  254.  
  255. { NULL, }
  256. };
  257.  
  258. // NOTE: If you edit these flags, also edit policy flags in Input.h.
  259. static const KeycodeLabel FLAGS[] = {
  260. { "WAKE", 0x00000001 },
  261. { "WAKE_DROPPED", 0x00000002 },
  262. { "SHIFT", 0x00000004 },
  263. { "CAPS_LOCK", 0x00000008 },
  264. { "ALT", 0x00000010 },
  265. { "ALT_GR", 0x00000020 },
  266. { "MENU", 0x00000040 },
  267. { "LAUNCHER", 0x00000080 },
  268. { "VIRTUAL", 0x00000100 },
  269. { "FUNCTION", 0x00000200 },
  270. { NULL, }
  271. };
  272.  
  273. static const KeycodeLabel AXES[] = {
  274. { "X", },
  275. { "Y", },
  276. { "PRESSURE", },
  277. { "SIZE", },
  278. { "TOUCH_MAJOR", },
  279. { "TOUCH_MINOR", },
  280. { "TOOL_MAJOR", },
  281. { "TOOL_MINOR", },
  282. { "ORIENTATION", },
  283. { "VSCROLL", },
  284. { "HSCROLL", },
  285. { "Z", },
  286. { "RX", },
  287. { "RY", },
  288. { "RZ", },
  289. { "HAT_X", },
  290. { "HAT_Y", },
  291. { "LTRIGGER", },
  292. { "RTRIGGER", },
  293. { "THROTTLE", },
  294. { "RUDDER", },
  295. { "WHEEL", },
  296. { "GAS", },
  297. { "BRAKE", },
  298. { "DISTANCE", },
  299. { "TILT", },
  300. { "GENERIC_1", },
  301. { "GENERIC_2", },
  302. { "GENERIC_3", },
  303. { "GENERIC_4", },
  304. { "GENERIC_5", },
  305. { "GENERIC_6", },
  306. { "GENERIC_7", },
  307. { "GENERIC_8", },
  308. { "GENERIC_9", },
  309. { "GENERIC_10", },
  310. { "GENERIC_11", },
  311. { "GENERIC_12", },
  312. { "GENERIC_13", },
  313. { "GENERIC_14", },
  314. { "GENERIC_15", },
  315. { "GENERIC_16", },
  316.  
  317. // NOTE: If you add a new axis here you must also add it to several other files.
  318. // Refer to frameworks/base/core/java/android/view/MotionEvent.java for the full list.
  319.  
  320. { NULL, - }
  321. };
  322.  
  323. #endif // _LIBINPUT_KEYCODE_LABELS_H

然后app可以通过如下方法获得对应键按下时的keyCode值,即“F11”对应获得的keyCode即为上面自定义的<546>:

  1. public boolean onKeyDown(int keyCode, KeyEvent event) { //重写的键盘按下监听
  2. alert("获取系统keyCode : "+ keyCode);
  3. return super.onKeyDown(keyCode, event);
  4. }

 三、添加自定义的键值:

(1)Kernel层:

     include/uapi/linux/input.h 中添加: #define KEY_LXL               123
     drivers/hid/hid-input.c 中添加:                case 0x188: map_key_clear(KEY_LXL);      break;   //其中0x188是HID设备上报的原始键值


(2)Android系统层:

  ① bionic/libc/kernel/uapi/linux/input-event-codes.h 中添加  : #define KEY_LXL               123    //与kernel中头文件定义一致
  ②
Generic.kl或Vendor_xxxx_Product_xxxx.kl文件中添加      :  key 123 LXL;
   ③
/frameworks/native/include/android/keycodes.h  中添加  :  AKEYCODE_LXL          = 666,
   ④
/frameworks/native/include/input/KeycodeLabels.h 的KEYCODES[]数组中添加: { "LXL", 666 },
   在frameworks/base/core/res/res/values/attrs.xml 中添加 :  <enum name="KEYCODE_LXL" value="666" />
   ⑥ 在frameworks/base/core/java/android/view/KeyEvent.java添加: public static final int KEYCODE_LXL= 666;

      
       经过如上的步骤就将Linux驱动向上层抛出的"123"键值和Android系统中的KEYCODE_LXL <666>对应起来了,然后可以在Android的framework层的键值处理函数中,捕获按键事件,并进行相应自定义处理,具体在frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.javainterceptKeyBeforeQueueing()函数中实现。

Android : 输入设备键值从底层到应用层的映射流程的更多相关文章

  1. Android 添加键值并上报从驱动到上层

    转载:https://blog.csdn.net/weixin_43854010/article/details/94390803 Android 添加键值并上报从驱动到上层 平台 :RK3288 O ...

  2. Appium的一点一滴:Android KEYCODE键值

    转自:http://blog.csdn.net/crisschan/article/details/50419963 - 电话键 键名 描述 键值 KEYCODE_CALL 拨号键 5 KEYCODE ...

  3. Appium ——Android KEYCODE键值:

    Python下语法: driver.keyevent(键值) 电话按键: 键名 描述 键值 KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME ...

  4. Android4.0 添加一个新的Android 键值

    这里添加新的键值,不是毫无凭据凭空创造的一个键值,而是根据kernel中检测到的按键值,然后转化为Android所需要的数值: 以添加一个Linux键值为217,把它映射为android的键值Brow ...

  5. Android4.2增加新键值

    这里添加新的键值,不是毫无凭据凭空创造的一个键值, 而是根据kernel中检测到的按键值,然后转化为android所需要的数值: 以添加一个linux键值为217,把它映射为android的键值Bro ...

  6. 从源码看HashMap键值对集合

    之前我们看过了两种类型的集合,ArrayList集合和LinkedList集合,两种集合各有优势,我们不具体说了,但是本篇要看的集合可以完成它们完成不了的任务.比如:现有一篇文章,要你统计其中出现了哪 ...

  7. Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值

    Android底层开发之Linux输入子系统要不要推断系统休眠状态上报键值 题外话:一个问题研究到最后,那边记录文档的前半部分基本上都是没用的,甚至是错误的. 重点在最后,前边不过一些假想猜測. ht ...

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

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

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

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

随机推荐

  1. (转)C# Delegate.Invoke、Delegate.BeginInvoke

    Delegate的Invoke.BeginInvoke 1.Delegate.Invoke (委托同步调用) a.委托的Invoke方法,在当前线程中执行委托. b.委托执行时阻塞当前线程,知道委托执 ...

  2. MySQL Connector/J

    5.1 Developer Guide 1. MysQL为由Java语言编程的客户端程序提供连接:MySQL Connector/J,这是一个实现Java Database Connectivity( ...

  3. HTML 第十二章总结

    HTML5 markup 前言 在这一章中,讲解了新的 HTML5 的一些 markup,并且对其中的<video>进行了很详细的讲解. New HTML5 elements 列表如下: ...

  4. Java中的参数传递 --Java

    1.基本类型传值,对象类型传地址 按值传递:当将一个参数传递给一个方法时,方法接收的是原始值的一个副本.因此,如果方法修改了该参数,仅改变副本,而原始值保持不变. 按引用传递:当将一个参数传递给一个方 ...

  5. hadoop 企业应用案例--大众点评

    hadoop 企业应用案例--大众点评 http://f.dataguru.cn/thread-260531-1-1.html

  6. linux网络配置命令(二)——ip

    ip命令 查看/设置路由.设备.路由策略和渠道信息 格式 ip [ OPTIONS ] OBJECT { COMMAND | help } OBJECT := { link | addr | addr ...

  7. python – time.sleep – 睡眠线程

    import time from threading import Thread class worker(Thread): def run(self): for x in xrange(0,11): ...

  8. 笔记react router 4(三)

    上一篇我们说到了路由组件的嵌套.想必你已经运用自如了.那么,这一次我们来聊一聊4.X中Router的变更. 在3.X中我们若使用路由的模式,可通过在Router上配置history的值即可. 例如, ...

  9. hbase的api操作

    创建maven工程,修改jdk pom文件里添加需要的jar包 dependencies> <dependency> <groupId>jdk.tools</gro ...

  10. 鼠标放上改变Button的大小

     private void enterBtn_MouseLeave(object sender, MouseEventArgs e)         {             enterBtn.Wi ...