通俗易通講解Android藍(lán)牙鍵值適配
以下圖中TV VOD兩個按鍵為例,文章中所涉及到的文件只寫文件名,因每個方案的路徑各不相同,請自行全局搜索文件。

?1.獲取按鍵的掃描碼
android設(shè)備串口或adb shell下執(zhí)行getevent -l(小寫的L),然后按下按鍵(以VOD鍵為例),打印結(jié)果如下:
getevent顯示結(jié)果中的三個有效信息:
- 1)000c006b? ?前四位000c為鍵值類型(詳情請?zhí)?與閱讀hid.h),后四位為藍(lán)牙鍵值;
- 2)KEY_BLUE? 如果在linux_key.h中有此按鍵的定義,此處就會顯示,如果linux_key.h中沒有對此鍵的定義就會顯示KEY_UNKNOWN.
- 3)/dev/input/event4: 設(shè)備節(jié)點,可以通過
dumpsys input命令查看此節(jié)點使用KeyLayoutFile(即映射鍵值的.kl的文件)
console:/ # getevent -l add device 1: /dev/input/event4 name: "語音助手" could not get driver version for /dev/input/mouse2, Not a typewriter add device 2: /dev/input/event3 name: "Hi Keypad" could not get driver version for /dev/input/mouse1, Not a typewriter add device 3: /dev/input/event1 name: "Hi mouse" could not get driver version for /dev/input/mice, Not a typewriter add device 4: /dev/input/event0 name: "Hi keyboard" could not get driver version for /dev/input/mouse0, Not a typewriter add device 5: /dev/input/event2 name: "qwerty" /dev/input/event4: EV_MSC MSC_SCAN 000c006b /dev/input/event4: EV_KEY KEY_BLUE DOWN /dev/input/event4: EV_SYN SYN_REPORT 00000000 /dev/input/event4: EV_MSC MSC_SCAN 000c006b /dev/input/event4: EV_KEY KEY_BLUE UP /dev/input/event4: EV_SYN SYN_REPORT 00000000
2.hid-input.c
從getevent -l時已知VOD按鍵為000c006b,前四位詳細(xì)定義可以參考kernel下的hid.h,此處只列舉幾個:
#define HID_UP_KEYBOARD 0x00070000 #define HID_UP_LED 0x00080000 #define HID_UP_BUTTON 0x00090000 #define HID_UP_ORDINAL 0x000a0000 #define HID_UP_TELEPHONY 0x000b0000 #define HID_UP_CONSUMER 0x000c0000
在hid-input.c中有個函數(shù)hidinput_configure_usage,會根據(jù)不同的hid執(zhí)行不同的代碼,為0007(HID_UP_KEYBOARD)時會處理hid_keyboard[256]的數(shù)組,把掃描碼轉(zhuǎn)換為10進(jìn)制后就是該數(shù)組的下標(biāo),數(shù)組下標(biāo)的數(shù)組元素就是linux鍵值,我的鍵值前面是000c所以跳過前面說的,case走的是HID_UP_CONSUMER,此case下已有對0x6b的處理,意思就是此鍵在linux中代表的是KEY_BLUE。
static void hidinput_configure_usage(struct hid_input *hidinput, struct hid_field *field,
struct hid_usage *usage)
{
/**省略**/
switch (usage->hid & HID_USAGE_PAGE) {
case HID_UP_UNDEFINED:
goto ignore;
/**省略**/
/**省略**/
case HID_UP_KEYBOARD:
set_bit(EV_REP, input->evbit);
if ((usage->hid & HID_USAGE) < 256) {
if (!hid_keyboard[usage->hid & HID_USAGE]) goto ignore;
map_key_clear(hid_keyboard[usage->hid & HID_USAGE]);
} else
map_key(KEY_UNKNOWN);
break;
case HID_UP_CONSUMER: /* USB HUT v1.12, pages 75-84 */
switch (usage->hid & HID_USAGE) {
case 0x06a: map_key_clear(KEY_GREEN); break;
case 0x06b: map_key_clear(KEY_BLUE); break;
case 0x06c: map_key_clear(KEY_YELLOW); break;
case 0x06d: map_key_clear(KEY_ZOOM); break;
/**省略**/
/**省略**/
}
那KEY_BLUE的鍵值是多少呢?
{"KEY_BLUE", 0x191},
我們來查閱linux_key.h,搜索KEY_BLUE,我的sdk中KEY_BLUE的值為0x191,轉(zhuǎn)換為十進(jìn)制值為401。
3.KeyLayoutFile? --> .kl
getevent -l時已知設(shè)備節(jié)點為/dev/input/event4,那我們執(zhí)行下dumpsys input,結(jié)果如下:
5: 語音助手
Classes: 0x8000012b
Path: /dev/input/event4
Enabled: true
Descriptor: e0cab5a5e7db45d100777208b12fb1c21978adca
Location:
ControllerNumber: 0
UniqueId: 18:11:18:24:33:18
Identifier: bus=0x0005, vendor=0x2b54, product=0x1600, version=0x0101
KeyLayoutFile: /vendor/usr/keylayout/Vendor_2b54_Product_1600.kl
KeyCharacterMapFile: /vendor/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: false
結(jié)果中可以看出我的藍(lán)牙遙控器的vendor=2b54,product=1600,所以系統(tǒng)優(yōu)先加載的我自己加到ROM中的kl(.kl命名規(guī)則與加載優(yōu)先級請自行百度),有的可能找不到,會加載Generic.kl等文件,請根據(jù)KeyLayoutFile:后的路徑的文件修改映射關(guān)系,如果為默認(rèn)的Generic.kl時,建議不要修改此文件,可以根據(jù)vendor與product規(guī)則自己新建一個文件。
那我們打開指向的這個kl文件,內(nèi)容如下:
#key 222 "KEY_RED" # key 400 "KEY_YELLOW" key 401 PROG_GREEN key 402 CHANNEL_UP key 403 CHANNEL_DOWN
kl文件格式簡單解析(詳解與其它使用方法自行搜索):
key?可以理解成固定格式?
222/401等數(shù)字對應(yīng)的就是linux的鍵值
PROG_GREEN 這里對應(yīng)的就是Android層的鍵值(此字符串要與InputEventLabels.h中的保持一致,否則會報Expected key code label異常,然后就加載其它默認(rèn)的kl文件了,5.0以前是KeycodeLabels.h或KeyCodeLabels.h)
既然都理清楚了,那處理按鍵豈不是很簡單了?
已知前面linux_key.h中查詢VOD的linux鍵值為401,如果你想讓此按鍵生效,把前面的#號去掉重啟設(shè)備,使其映射關(guān)系生效即可,如果你想改變鍵值的功能,可以直接在此kl中把401對應(yīng)的android層的KEY_BLUE改為你想要的鍵就可以了。(當(dāng)然也可以修改linux的鍵值,但不提倡這么做.)
總結(jié):
- 1.通過getevent -l獲取鍵值設(shè)備節(jié)點;
- 2.hid-input.c中添加或修改你的鍵值;
- 3.通過設(shè)備節(jié)點找到對應(yīng)的kl文件;
- 4.添加或修改映射關(guān)系;
以上所述是小編給大家介紹的Android藍(lán)牙鍵值適配,希望對大家有所幫助。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
微信或手機(jī)瀏覽器在線顯示office文件(已測試ios、android)
這篇文章主要介紹了微信或手機(jī)瀏覽器在線顯示office文件,已測試ios、android,感興趣的小伙伴們可以參考一下2016-06-06
Android使用AutoCompleteTextView實現(xiàn)自動填充功能的案例
今天小編就為大家分享一篇關(guān)于Android使用AutoCompleteTextView實現(xiàn)自動填充功能的案例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03
Android?Studio實現(xiàn)音樂播放器2.0的全過程
音樂帶給人的聽覺享受是無可比擬的,動聽的音樂能夠愉悅?cè)说纳硇?讓人更加積極地去熱愛生活,下面這篇文章主要給大家介紹了關(guān)于Android?Studio實現(xiàn)音樂播放器2.0的相關(guān)資料,需要的朋友可以參考下2022-02-02
android開發(fā)教程之判斷是手機(jī)還是平板的方法
判斷是平板還是手機(jī),通過很多的方式都可以實現(xiàn),如:設(shè)備尺寸、DPI、版本號、是否具備電話功能等,不過有些沒有那么的精準(zhǔn),這里分享一個比較簡潔的方法2014-04-04
Android設(shè)計模式之代理模式Proxy淺顯易懂的詳細(xì)說明
Android設(shè)計模式之代理模式也是平時比較常用的設(shè)計模式之一,代理模式其實就是提供了一個新的對象,實現(xiàn)了對真實對象的操作,或成為真實對象的替身2018-03-03
深入理解Android熱修復(fù)技術(shù)原理之資源熱修復(fù)技術(shù)
Android資源的熱修復(fù),就是在app不重新安裝的情況下,利用下發(fā)的補丁包 直接更新本app中的資源2021-06-06
Android編程調(diào)用系統(tǒng)自帶的拍照功能并返回JPG文件示例【附demo源碼下載】
這篇文章主要介紹了Android編程調(diào)用系統(tǒng)自帶的拍照功能并返回JPG文件,結(jié)合實例形式分析了Android的拍照功能調(diào)用及圖形文件操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-07-07

