Android下添加新的自定義鍵值和按鍵處理流程
說出來不怕大家笑話,我寫這篇博客的原因在於前幾天去一個小公司面試Android系統工程師,然后在面試的時候對方的技術總監問了我一個問題,請你詳細描述一下怎么在Android下添加自定義鍵值和詳細描述下Android的按鍵處理流程。現在回想起來當時回答的確實不是很好,乘着現在比較空閑的時機就來分析下上述的兩個問題。
首先分析下Android下怎么添加新的自定義鍵值。在Android的原生系統中鍵值默認情況下是92個,從0-91;一般情況下,這些鍵值是夠用的,但是如果想擴充的話,還是需要添加新的鍵值的,那么如何將一個新的鍵值從驅動的設置映射到上層,使應用可以對我們自定義的鍵值進行相應的處理呢?
首先分析下Android下怎么添加新的自定義鍵值。在Android的原生系統中鍵值默認情況下是92個,從0-91;一般情況下,這些鍵值是夠用的,但是如果想擴充的話,還是需要添加新的鍵值的,那么如何將一個新的鍵值從驅動的設置映射到上層,使應用可以對我們自定義的鍵值進行相應的處理呢?
在介紹Android怎么添加新的鍵值以前先介紹下Android下INPUT子系統FLOW的流程,下面就是精簡的流程圖示意圖:
1.添加按鍵及其映射
1)如果系統有新的按鍵需要添加,瑪門是怎么添加並上報到系統上層去的呢(這里的上層主要指的是Android應用層),首先要確定的是我們的遙控設備是通過/dev/input目錄下那個event調用那個kl文件,這里可以通過如下命令超看cat /proc/bus/input/devices,下面是在終端下的打印信息
- <span style=< span="">"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 style=< span="">"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
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的按鍵值是就是我們新添加的鍵值了。
