2020-02-29
關鍵字:
海思平台的遙控器適配過程還算是比較簡單的,就是要稍微費上一些時間而已。
遙控器的適配流程大致可以分成兩個步驟:
1、按鍵事件從遙控器傳遞到內核
2、按鍵事件從內核傳遞到普通應用
1、從遙控器到內核
首先我們要知道你要適配的遙控器的每一個按鍵的鍵碼,即你按下某個按鍵后海思平台能識別到的鍵碼值。
直接在串口敲以下命令運行相關程序:
android_ir_user -D
android_ir_user 是預置在 /system/bin 下的一個遙控輸入與解析的程序。
該程序在運行起來以后逐個按下遙控器上的按鍵,並記錄下相應鍵碼值,視你的遙控器按鍵數量,這一步會相對比較消耗時間:
然后將這些值填入 key.xml 文件:
device/hisilicon/bigfish/system/ir_user/key_pars/key.xml
第二步是打開 linux_key.h 文件:
device/hisilicon/bigfish/system/ir_user/key_pars/linux_key.h
在文件中的 Linux_KeyCode_Ary 數組中添加你要新增的按鍵信息:
const linux_keycode_ary Linux_KeyCode_Ary[512]
這一步中數組第一個元素必須要與 key.xml 中的 name 完全一致。如此一來,當按下某個遙控器按鍵以后,系統就會將這個按鍵值識別成你所設置的那個數字數值。
第三步則是找到你系統中所用的那個 kl 文件,並將要增加的按鍵的信息填寫進去:
device/hisilicon/bigfish/prebuilts/
這個 kl 文件可能會有多套,具體使用的是哪一套要以你自己的項目為准,一般供開發人員使用的 kl 文件都保存於以上所示的目錄內,可以參考這個目錄下的 Android.mk 來確定。
一般來講,海思平台會使用兩套 kl 文件,它們們於開發板文件系統的以下位置:
system/usr/keylayout/Generic.kl
system/usr/keylayout/Vendor_0001_Product_0001.kl
在相應的 kl 文件中合適的位置新增你的信息,要注意關鍵信息的唯一性:
同時要注意這里的按鍵信息是沒有前綴 " KEY_ " 的。並且中間的數字值也要與 linux_key.h 中的一致。另外,這一塊的信息中間的數字要填十進制形式的。
至此,我們就實現了一套新的遙控器按鍵的事件從遙控器到系統內核的適配了。
2、從內核到普通應用
這一部分說簡單也簡單,說麻煩也挺麻煩,看你的要求有多高了。
首先來操作 KeycodeLabels.h 文件:
frameworks/native/include/input/KeycodeLabels.h
在 KEYCODES 數組中新增你要適配的按鍵信息:
static const KeycodeLabel KEYCODES[]
這里的字符串信息要與前面 kl 文件中的完全一致,但數字值卻可以不同了。
這一步實現了以后你的遙控器按鍵事件就能到 Android 的框架層了。以 SMARG_GROOM 按鍵為例,當用戶按下這一按鍵時,在Android框架層可以接收到值為 261 的 keycode 值。
一般來說,適配到這里就差不多了,已經可以在 APK 中監聽到按鍵事件了。但是有一個不足的就是在應用開發中無法像傳統按鍵那樣以 KeyEvent.KEYCODE_0 、 KeyEvent.KEYCODE_DPAD_CENTER 這種類型來編寫代碼。
如果要實現這種需求,則還需要再進一步配置:
首先打開 KeyEvent.java:
frameworks/base/core/java/android/view/KeyEvent.java
在合適的位置增加如下所示的按鍵值信息:
這里的數字值必須要與前面 KeycodeLables.h 中的一致。
同時再在 populateKeycodeSymbolicNames 中按如下形式添加你的按鍵信息:
然后打開 attrs.xml 文件:
frameworks/base/core/res/res/values/attrs.xml
按如下形式添加按鍵信息:
至此,就可以實現在應用開發中通過 KeyEvent.SMART_GROOM 的形式來監聽按鍵事件了。
最后,附上一份海思官方的適配遙控器按鍵的文檔,這份文檔所記錄的步驟更詳細,但主要的步驟按筆者上面的描述就夠了。
鏈接:https://pan.baidu.com/s/1UMjFD4C9JsMkuvu46-d-vQ
提取碼:re80