Android下添加新的自定义键值和按键处理流程
首先分析下Android下怎么添加新的自定义键值。在Android的原生系统中键值默认情况下是92个,从0-91;一般情况下,这些键值是够用的,但是如果想扩充的话,还是需要添加新的键值的,那么如何将一个新的键值从驱动的设置映射到上层,使应用可以对我们自定义的键值进行相应的处理呢?
通过打印信息我们可以知道,我们的终端设备使用的是Vendor_3697_Product_0001.kl文件,我这里只分析IT遥控设备,那我们的Vendor_3697_Product_0001.kl里面又是啥呢,我们可以通过cat命令查看,具体的信息如下:
2)在Vendor_3697_Product_0001.kl文件中添加映射
首先分析下Android下怎么添加新的自定义键值。在Android的原生系统中键值默认情况下是92个,从0-91;一般情况下,这些键值是够用的,但是如果想扩充的话,还是需要添加新的键值的,那么如何将一个新的键值从驱动的设置映射到上层,使应用可以对我们自定义的键值进行相应的处理呢?
在介绍Android怎么添加新的键值以前先介绍下Android下INPUT子系统FLOW的流程,下面就是精简的流程图示意图:
1.添加按键及其映射
1)如果系统有新的按键需要添加,玛门是怎么添加并上报到系统上层去的呢(这里的上层主要指的是Android应用层),首先要确定的是我们的遥控设备是通过/dev/input目录下那个event调用那个kl文件,这里可以通过如下命令超看cat /proc/bus/input/devices,下面是在终端下的打印信息
- <span style="font-family:FangSong_GB2312;font-size:18px;">shell@orange:/ # cat /proc/bus/input/devices
- I: Bus=0018 Vendor=3697 Product=0001 Version=0001
- N: Name="MStar Smart TV IR Receiver"
- P: Phys=/dev/ir
- S: Sysfs=/devices/virtual/rc/rc0/input0
- U: Uniq=
- H: Handlers=kbd event0
- B: PROP=0
- B: EV=13
- B: KEY=fc0000 0 fc900 142851 0 0 0 0 108000 1a8 c0000c01 9e37c0 48007 f8000000 10000ffc
- B: MSC=10
- I: Bus=0000 Vendor=0000 Product=0000 Version=0000
- N: Name="MCE IR Keyboard/Mouse (ir)"
- P: Phys=/input0
- S: Sysfs=/devices/virtual/input/input1
- U: Uniq=
- H: Handlers=kbd mouse0 event1
- B: PROP=0
- B: EV=100017
- B: KEY=30000 0 7 ff87207a c14057ff febeffdf ffefffff ffffffff fffffffe
- B: REL=3
- B: MSC=10
- shell@orange:/ #
- shell@orange:/ # </span>
- <span style="font-family:FangSong_GB2312;font-size:18px;"># Copyright (C) 2010 The Android Open Source Project
- #
- # Licensed under the Apache License, Version 2.0 (the "License");
- # you may not use this file except in compliance with the License.
- # You may obtain a copy of the License at
- #
- # http://www.apache.org/licenses/LICENSE-2.0
- #
- # Unless required by applicable law or agreed to in writing, software
- # distributed under the License is distributed on an "AS IS" BASIS,
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- # See the License for the specific language governing permissions and
- # limitations under the License.
- #
- # MStar Smart TV IR Receiver.
- #
- key 116 POWER WAKE
- key 11 0
- key 2 1
- key 3 2
- key 4 3
- key 5 4
- key 6 5
- key 7 6
- key 8 7
- key 9 8
- key 10 9
- key 398 PROG_RED
- key 399 PROG_GREEN
- key 400 PROG_YELLOW
- key 401 PROG_BLUE
- key 103 DPAD_UP
- key 108 DPAD_DOWN
- key 105 DPAD_LEFT
- key 106 DPAD_RIGHT
- key 28 ENTER
- key 402 CHANNEL_UP WAKE_DROPPED
- key 403 CHANNEL_DOWN WAKE_DROPPED
- key 115 VOLUME_UP WAKE_DROPPED
- key 114 VOLUME_DOWN WAKE_DROPPED
- key 104 PAGE_UP
- key 109 PAGE_DOWN
- key 102 HOME WAKE_DROPPED
- key 139 MENU WAKE_DROPPED
- key 158 BACK
- key 113 VOLUME_MUTE
- key 167 DVR
- key 138 GUIDE
- key 358 INFO
- #key 82 WINDOW
- #key 79 TV_INPUT
- key 168 MEDIA_REWIND
- key 159 MEDIA_FAST_FORWARD
- key 165 MEDIA_PREVIOUS
- key 163 MEDIA_NEXT
- key 207 MEDIA_PLAY
- key 119 MEDIA_PAUSE
- key 128 MEDIA_STOP
- # Common extended
- key 392 SOUND_MODE
- key 212 PICTURE_MODE
- key 372 ASPECT_RATIO
- key 363 CHANNEL_RETURN
- key 142 SLEEP
- key 365 EPG
- key 395 LIST
- #key 370 SUBTITLE
- key 466 MTS
- key 467 FREEZE
- key 468 TTX
- key 469 CC
- key 470 TV_SETTING
- key 471 SCREENSHOT
- key 356 TV_POWER
- # Mstar extended
- key 59 MSTAR_BALANCE
- key 60 MSTAR_INDEX
- key 61 MSTAR_HOLD
- key 62 MSTAR_UPDATE
- key 63 MSTAR_REVEAL
- key 64 MSTAR_SUBCODE
- key 65 MSTAR_SIZE
- key 66 MSTAR_CLOCK</span>
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的按键值是就是我们新添加的键值了。
123 -- 该按键在linux驱动中对应的键值,我在这里只是假设的这个值,至于具体对应的是那个可以查看“include/linux/input.h”
WLS -- 123按键映射到Android中的按键,它对应是“KeycodeLabels.h”文件中的KEYCODES表格元素的“literal”值。
其中KeycodeLabels.h的定义如下,我们可以在"MSTAR_PVR_BROWSER", 319后面添加我们需要向Android上层抛的键值,我们这里定义为"WLS", 320,所以当Android上层监听到320的按键值是就是我们新添加的键值了。
- <span style="font-family:FangSong_GB2312;font-size:18px;">/*
- * Copyright (C) 2008 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
- #ifndef _LIBINPUT_KEYCODE_LABELS_H
- #define _LIBINPUT_KEYCODE_LABELS_H
- #include <android/keycodes.h>
- struct KeycodeLabel {
- const char *literal;
- int value;
- };
- static const KeycodeLabel KEYCODES[] = {
- { "SOFT_LEFT", 1 },
- { "SOFT_RIGHT", 2 },
- { "HOME", 3 },
- { "BACK", 4 },
- { "CALL", 5 },
- { "ENDCALL", 6 },
- { "0", 7 },
- { "1", 8 },
- { "2", 9 },
- { "3", 10 },
- { "4", 11 },
- { "5", 12 },
- { "6", 13 },
- { "7", 14 },
- { "8", 15 },
- { "9", 16 },
- { "STAR", 17 },
- { "POUND", 18 },
- { "DPAD_UP", 19 },
- { "DPAD_DOWN", 20 },
- { "DPAD_LEFT", 21 },
- { "DPAD_RIGHT", 22 },
- { "DPAD_CENTER", 23 },
- { "VOLUME_UP", 24 },
- { "VOLUME_DOWN", 25 },
- { "POWER", 26 },
- { "CAMERA", 27 },
- { "CLEAR", 28 },
- { "A", 29 },
- { "B", 30 },
- { "C", 31 },
- { "D", 32 },
- { "E", 33 },
- { "F", 34 },
- { "G", 35 },
- { "H", 36 },
- { "I", 37 },
- { "J", 38 },
- { "K", 39 },
- { "L", 40 },
- { "M", 41 },
- { "N", 42 },
- { "O", 43 },
- { "P", 44 },
- { "Q", 45 },
- { "R", 46 },
- { "S", 47 },
- { "T", 48 },
- { "U", 49 },
- { "V", 50 },
- { "W", 51 },
- { "X", 52 },
- { "Y", 53 },
- { "Z", 54 },
- { "COMMA", 55 },
- { "PERIOD", 56 },
- { "ALT_LEFT", 57 },
- { "ALT_RIGHT", 58 },
- { "SHIFT_LEFT", 59 },
- { "SHIFT_RIGHT", 60 },
- { "TAB", 61 },
- { "SPACE", 62 },
- { "SYM", 63 },
- { "EXPLORER", 64 },
- { "ENVELOPE", 65 },
- { "ENTER", 66 },
- { "DEL", 67 },
- { "GRAVE", 68 },
- { "MINUS", 69 },
- { "EQUALS", 70 }, <