遙控器鍵值適配
一般來說,遙控器分藍(lán)牙遙控器和紅外遙控器。紅外遙控器是指遙控器通過紅外發(fā)射器把信號進(jìn)行發(fā)射,接收設(shè)備則通過紅外接收器進(jìn)行信號接收;藍(lán)牙遙控器是指遙控器通過藍(lán)牙方式進(jìn)行交互,遙控器和被連接設(shè)備均支持藍(lán)牙則可以進(jìn)行藍(lán)牙操作。
每個遙控器的每個按鍵都有獨(dú)特的物理碼,這是遙控器出廠時就已經(jīng)具備的,而且不同的遙控器廠商也有單獨(dú)的用戶碼。我們通過已知的條件,需要在SDK里做出相應(yīng)的適配和映射。
-
遙控器紅外鍵值沒定義
1.第一步:要知道這個遙控器的按鍵對應(yīng)的scancode碼是什么?有兩種方式可以知道這個scancode沒定義的值是什么。一、使用命令dmesg -c;二、使用echo 8 > /proc/sys/kernel/printk;這兩種方式都可以查詢到遙控器某個按鍵沒定義的物理碼。以下我用音量鍵減沒定義為例。
通過使用dmesg -c查詢?nèi)缦拢?br>
如上圖所示,很明顯可以看到音量鍵減沒定義的物理碼是154,這個是十進(jìn)制的數(shù)值,需要轉(zhuǎn)換為十六進(jìn)制,轉(zhuǎn)換之后為9A,這個值先保留記住,之后適配時需要用上。2.第二步:需要知道遙控器的用戶碼,每款遙控器都有獨(dú)特的用戶碼,就好像每個人都有自己的身份證一樣,用戶碼就是遙控器身份證。使用cat /sys/devices/virtual/remote/amremote/customcode命令進(jìn)行查看遙控器用戶碼,在串口執(zhí)行該命令后,按下遙控器的任意鍵,再次執(zhí)行該命令就可以看到你使用這款遙控器的用戶碼了。
3.第三步:進(jìn)行定義。需要定義該用戶碼相關(guān)的remote配置文件,該文件是主要映射物理碼和安卓鍵碼的,是聯(lián)系底層和上層的一個樞紐文件。知道了用戶碼和物理碼即可開始配置remote配置文件,配置內(nèi)容如下:
// remote配置文件 custom_name = test-remote-1 custom_code = 0xc43b release_delay = 80 key_begin 0x9a 114 #VOLUME_DOWN key_end
此時使用getevent命令,再按壓音量鍵減,則會有相應(yīng)的輸出,如下:
但此時音量鍵的功能還沒能正常使用,需要把remote文件和kl文件關(guān)聯(lián)起來。4.第四步:需要知道遙控器對應(yīng)的kl是哪個,需要知道遙控器的pid和vid是什么?也可以知道目前遙控器使用的是哪個kl文件?從上面步驟可得知,目前遙控器使用的event是/dev/input/event1,可以使用getevent -v來得知/dev/input/event1對應(yīng)的是哪個pid和vid,使用getevent -v得出結(jié)果如下:
紅色框住的就是pid和vid,我們可以通過pid和vid直接配置kl文件,放置文件到指定目錄下??梢允褂胐umpsys input命令查詢到目前/dev/input/event1對應(yīng)的kl文件,如下:
目前知道了kl文件,文件名字也和pid、vid對應(yīng),則無須新建,直接通過vi修改文件,把音量鍵減的邏輯添加進(jìn)去,剛才在remote文件中定義0x9a對應(yīng)的是114,所以在kl文件里面則是通過114這個id來做標(biāo)識,在kl文件里面添加邏輯如下:key 114 VOLUME_DOWN
此時音量鍵減功能已生效,肯定還有看官會很疑惑為什么音量鍵減功能就會生效了,其實(shí)關(guān)鍵就在VOLUME_DOWN這個值里,這個不是隨便寫的,是有底層文件與之相對應(yīng)的。
5.第五步:要查找KeyEvent.java文件相關(guān)定義,路徑為frameworks/base/core/java/android/view/,查看到相關(guān)代碼如下:
/** Key code constant: Volume Down key. * Adjusts the speaker volume down. */ public static final int KEYCODE_VOLUME_DOWN = 25;
數(shù)值25則是映射成最上層的安卓鍵值,可通過命令logcat -s WindowManager進(jìn)行查詢,按壓音量鍵減,logcat -s WindowManager結(jié)果輸出如下:
按下和彈起則是一個輪回,可以看到輸出結(jié)果就是25,和KeyEvent.java文件里面的值對應(yīng)了起來。
重點(diǎn):一般定義的鍵值涉及三個文件(attrs.xml、keycodes.h、InputEventLabels.h),在這三個文件里都會得到音量鍵減的相關(guān)的一些邏輯,如下://路徑為:frameworks/base/core/res/res/values/attrs.xml <enum name="KEYCODE_VOLUME_DOWN" value="25" />
//路徑為:frameworks/native/include/android/keycodes.h /** Volume Down key. * Adjusts the speaker volume down. */ AKEYCODE_VOLUME_DOWN = 25,
//路徑為:frameworks/native/include/input/InputEventLabels.h DEFINE_KEYCODE(VOLUME_DOWN),
之后需要自定義鍵值在該四個文件里進(jìn)行定義即可。
小知識:可在hotkey.properties文件下配置熱鍵,一般預(yù)置在設(shè)備的/system/etc目錄下。
至此,紅外遙控器的鍵值簡單適配和定義講訴完畢,下面講藍(lán)牙遙控器的鍵值適配和定義。 -
遙控器藍(lán)牙鍵值沒定義
1.第一步:通過藍(lán)牙連接好藍(lán)牙遙控器和設(shè)備。
2.第二步:需要知道沒定義遙控器的藍(lán)牙HID鍵碼值Usage ID,如果是自定義的Usage ID,一般需要遙控器廠商提供,一般是根據(jù)規(guī)范定義出來的。我以藍(lán)牙遙控器#鍵為例,目前藍(lán)牙遙控器#鍵沒有效果,通過getevent命令也沒有任何輸出,通過查詢可知#鍵的Usage ID為0x304,這個需要記住,下面適配需要用上。
小知識:HID鍵碼值不止Usage ID,還有Usage Page,Usage Page一般為0x07和0x0C兩個數(shù)值,0x07代表已經(jīng)定義好的鍵碼,0x0C代表用戶自定義的鍵碼。
3.第三步:適配HID鍵值,首先需要修改hid-input.c,這個文件先用Usage ID和input.h先關(guān)聯(lián)起來,用戶自定義的鍵值一般需要修改hid-input.c中hidinput_configure_usage方法,然后找到方法里的HID_UP_CONSUMER里面進(jìn)行添加,代碼添加如下://common/drivers/hid/hid-input.c case 0x304: map_key_clear(KEY_POUND); break;
input.h文件也須添加相關(guān)代碼,input.h里面對應(yīng)的值,到時候getevent也會輸出對應(yīng)的值,添加代碼如下:
//common/include/uapi/linux/input.h #define KEY_POUND 0x2f1
注意:在input.h里面也可知道定義的最大值不能超過0x2ff,不然溢出則定義失敗。
小知識:0x07的HID鍵碼表如下:static const unsigned char hid_keyboard[256] = { 0, 0, 0, 0, 30, 48, 46, 32, 18, 33, 34, 35, 23, 36, 37, 38, 50, 49, 24, 25, 16, 19, 31, 20, 22, 47, 17, 45, 21, 44, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 28, 1, 14, 15, 57, 12, 13, 26, 27, 43, 43, 39, 40, 41, 51, 52, 53, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 87, 88, 99, 70,119,110,102,104,111,107,109,106, 105,108,103, 69, 98, 55, 74, 78, 96, 79, 80, 81, 75, 76, 77, 71, 72, 73, 82, 83, 86,127,116,117,183,184,185,186,187,188,189,190, 191,192,193,194,134,138,130,132,128,129,131,137,133,135,136,113, 115,114,unk,unk,unk,121,unk, 89, 93,124, 92, 94, 95,unk,unk,unk, 122,123, 90, 91, 85,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,179,180,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk,unk, unk,unk,unk,unk,unk,unk,unk,unk,111,unk,unk,unk,unk,unk,unk,unk, 29, 42, 56,125, 97, 54,100,126,164,166,165,163,161,115,114,113, 150,158,159,128,136,177,178,176,142,152,173,140,unk,unk,unk,unk };
4.第四步:getevent有值并且知道值為0x2f1,需要轉(zhuǎn)換為十進(jìn)制為753,需要到對應(yīng)kl文件里進(jìn)行相關(guān)配置,通過getevent -v得知藍(lán)牙遙控器的pid和vid,如下:
所以通過pid和vid配置相關(guān)kl即可。使用dumpsys input知道目前使用的kl是默認(rèn)的,如下:
通過pid和vid配置kl,名稱為Vendor_0508_Product_0110.kl,配置后和內(nèi)容如下:///system/usr/keylayout/Vendor_0508_Product_0110.kl key 753 POUND
至此,藍(lán)牙鍵值定義完成。文章來源:http://www.zghlxwxcb.cn/news/detail-447308.html
由上,紅外遙控器和藍(lán)牙遙控器的鍵值定義和適配完成了,有疑問聯(lián)系。文章來源地址http://www.zghlxwxcb.cn/news/detail-447308.html
到了這里,關(guān)于電視紅外/藍(lán)牙遙控器鍵值定義和適配的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!