android升级功能键,Android 按键添加转载
按鍵從Linux到Android
現(xiàn)在的普通按鍵也集成到Linux Input子系統(tǒng)中了,只需要把按鍵對(duì)應(yīng)的IO端口配置好,按鍵就可以工作了。所以一般提供的BSP(或者叫作解決方案)中,已經(jīng)完善了按鍵驅(qū)動(dòng)。關(guān)鍵是快速的了解按鍵的映射。所以這里不作源碼級(jí)分析。源碼分析可以參考這里:《基于S3C2440的Linux-3.6.6移植——按鍵驅(qū)動(dòng)》
Linux按鍵的掃描碼
掃描碼是Linux Input系統(tǒng)中規(guī)定的碼值,好比PC鍵盤上每個(gè)鍵的鍵值。都是數(shù)字。
在設(shè)備上輸入一下命令后,按鍵可以探測(cè)到得到每個(gè)按鍵的掃描碼Code.
root@android:/ # busybox hexdump /dev/input/event0 ?(20141009更:同樣可以使用Android中專用的getevent命令)
Android 與 Linux分隔線
Android也定義了一套碼,叫作鍵盤碼,通過一個(gè)/system/usr/keylayout/來將兩套碼對(duì)應(yīng)起來。目前調(diào)試的是全志的A10的BSP包。這里用的是sun4i-keyboard.kl。(如果沒有其它*.kl,則是默認(rèn)的qwerty.kl)
Linux上傳的Code是0x00d9對(duì)應(yīng)10進(jìn)制217,打開sun4i-keyboard.kl后可以看到映射關(guān)系:
可以看出對(duì)應(yīng)的是BRIGHTNESS_DOWN,Android中只認(rèn)BRIGHTNESS_DOWN(這里成為字串),Linux中的Code至此為止。 ?(在Android源碼中也能找到這個(gè)映射文件可以依名字搜索找到其位置)
Android源碼中添加該按鍵
如果Android中frameworks/base/core/java/android/view/KeyEvent.java有要添加的功能,比如HOME,則只修改*.kl映射按鍵即可修改或者添加映射。
如果KeyEvent.java中本沒有要添加按鍵的功能,就可以在KeyEvent.java的KeyEvent類最后依葫蘆畫瓢添加:
如不知道功能的鍵盤碼是多少可以到這里找到。
然后根據(jù)KeyEvent類最后的添加鍵提示,每個(gè)文件都添加上:
// NOTE: If you add a new keycode here you must also add it to:
// ?isSystem()
// ?frameworks/base/native/include/android/keycodes.h
// ?frameworks/base/include/ui/KeycodeLabels.h
// ?external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
// ?frameworks/base/core/res/res/values/attrs.xml
// ?emulator?
// ?LAST_KEYCODE
// ?KEYCODE_SYMBOLIC_NAMES
//
// ?Also Android currently does not reserve code ranges for vendor-
// ?specific key codes. ?If you have new key codes to have, you
// ?MUST contribute a patch to the open source project to define
// ?those new codes. ?This is intended to maintain a consistent
// ?set of key code definitions across all Android devices.
添加后,Android應(yīng)用程序就可以通過onKeyDown檢測(cè)到了檢測(cè)到這個(gè)按鍵了。至于這個(gè)按鍵具體功能的實(shí)現(xiàn)比如這里的
BRIGHTNESS_DOWN(亮度減)功能,要修改frameworks/base/policies/base/phone/com
/android/internal/policy/impl/PhoneWindowManager.java。根據(jù)具體需求實(shí)現(xiàn)。
關(guān)于重啟(Reset)鍵
這個(gè)“按鍵”一般是通過直接連接CPU芯片上的復(fù)位實(shí)現(xiàn)重啟功能的。這個(gè)直接操作的是CPU,Android(或者Linux)是無法去檢測(cè)和控制這個(gè)“按鍵”的。
20140306更新:
今天再次遇到同樣的問題,為Android添加按鍵。平臺(tái)是rk30,Android版本是4.2.2。遇到了一些新問題和新的挑戰(zhàn),花費(fèi)一天時(shí)間添加完畢。且做了完整的規(guī)劃。以CAMERA和OTHAER鍵為例。
1.確認(rèn)內(nèi)核層的鍵值碼
進(jìn)入adb?shell,使用toolbox中的getevent工具:type?code?value。主要看type為1時(shí)的code值是多少。
2.確認(rèn)*.kl文件
確認(rèn)方法是交換V+和V-的鍵值碼,結(jié)果是:自定義:rk29-keypad.kl,一般鍵盤是:Generic.kl,qwerty.kl已經(jīng)被Generic.kl取代。
3.確認(rèn)如何修改*.kl會(huì)起效
重啟后
4.確認(rèn)兩個(gè)kl區(qū)別
從里邊內(nèi)容可以大概分別出來rk29-keypad.kl決定新添加的,Generic.kl包含了所有的鍵,優(yōu)先級(jí)低于rk29-keypad.kl,也就是兩個(gè)kl文件可以同定義一個(gè)鍵值,但會(huì)以rk29-keypad.kl首先為準(zhǔn)(如果rk29-keypad.kl中定義了,但是字串Android層沒有處理比如”key?114???FUCK”,”FUCK”上層并沒有處理,還是會(huì)去處理Generic.kl中的對(duì)應(yīng)鍵串),所以新添加的鍵值都添加到rk29-keypad.kl中,Generic.kl是建議不動(dòng)的。
注意事項(xiàng):kl定義的鍵串必須是Android層進(jìn)行處理的,如果有出現(xiàn)沒有處理的鍵串會(huì)導(dǎo)致整個(gè)鍵盤都不能使用。如果是鍵盤只會(huì)讀Generic.kl,而不會(huì)讀rk29-keypad.kl。所以如果是一個(gè)特殊的鍵盤,那么要?jiǎng)邮中薷腉eneric.kl。這個(gè)是實(shí)踐結(jié)果,具體源碼還沒有找到。
5.先打通一個(gè)已經(jīng)半通的CAMERA
CAMERA是上層已經(jīng)完善的,在kl文件將新按鍵映射到的CAMERA上(key?132?CAMERA),然后用一個(gè)apk來驗(yàn)證接收。結(jié)果OK。
6.打通整個(gè)通道-添加OTHER鍵值
在添加過程中還參考了篇文章《Android4.1添加新的按鍵(3)》,這里記錄4.2.2中具體修改了哪些文件:
external/webkit/Source/WebKit/android/plugins/ANPKeyCodes.h
frameworks/base/api/current.txt
frameworks/base/core/java/android/view/KeyEvent.java(兩處)
frameworks/base/core/res/res/values/attrs.xml
frameworks/base/data/keyboards/Generic.kl
frameworks/base/include/androidfw/KeycodeLabels.h
frameworks/base/libs/androidfw/Input.cpp
frameworks/native/include/android/keycodes.h
其中current.txt是在添加其它文件后執(zhí)行make?update-api編譯自動(dòng)修改的結(jié)果。關(guān)于Android上層在哪里解析的這個(gè)兩個(gè)kl文件,要等下次更新了。
20140315更新:
很快又用到這里的信息,今天是添加一個(gè)紅外遙控的鍵值,結(jié)果也得修改Generic.kl,修改rk**.kl不行。就簡(jiǎn)單的記錄到這里。
20141010更新:
Android上層也在不斷的更新,4.0/4.2的時(shí)候亮度的調(diào)節(jié)還是要自己添加按鍵來實(shí)現(xiàn),4.4中KeyEvent.java已經(jīng)有了這兩個(gè)按鍵鍵值,對(duì)應(yīng)Generic.kl中已經(jīng)已經(jīng)有了對(duì)應(yīng)到Linux內(nèi)核的標(biāo)準(zhǔn)亮度調(diào)試鍵值。
From:
不僅可以驗(yàn)證內(nèi)核發(fā)出的輸入事件,同樣不可以模擬輸入事件到Android上層。如下命令模擬「亮度減」的按鍵。
$?adb?shell?input?keyevent?BRIGHTNESS_DOWN
執(zhí)行后就可以Android系統(tǒng)可以響應(yīng)出來?調(diào)整亮度。就可以說明Android上層已經(jīng)暢通無阻了。
根據(jù)以上分析,那么在Android4.4中配置內(nèi)核中只上報(bào)標(biāo)準(zhǔn)的內(nèi)核亮度鍵值KEY_BRIGHTNESSDOWN/KEY_BRIGHTNESSUP就可以正常的對(duì)接了。
但是我同樣遇到了亮度按鍵不能響應(yīng)的問題,通過上下觀察值都對(duì)應(yīng)上去的,但是卻不能正常響應(yīng)。
經(jīng)實(shí)驗(yàn),將如下「亮度鍵值」添加到rk29-keypad.kl中可以正常響應(yīng)了:
key?224???BRIGHTNESS_DOWN
key?225???BRIGHTNESS_UP
事后根據(jù)Android官方教程Key?Layout?Files分析它會(huì)優(yōu)先讀取/system/usr/keylayout/DEVICE_NAME.kl按鍵映射文件。而設(shè)備上的物理按鍵的設(shè)備名正好是「rk29-keypad」,可以通過getevent查看出來。
這也解釋了20140315添加紅外遙控器的鍵值時(shí)不能添加到rk29-keypad.kl中,而添加到Generic.kl可以正常。因?yàn)镚eneric.kl的屬于fallback級(jí)別的映射文件。針對(duì)遙控器正確的方法同樣新建立一個(gè)DEVICE_NAME.kl的映射文件。比如遙控器設(shè)備名為rkxx-remotectl那么新建一個(gè)rkxx-remotectl.kl映射文件,內(nèi)容是和Generic.kl中類似的每個(gè)鍵值對(duì)應(yīng)的鍵碼。這個(gè)方法要遠(yuǎn)比直接修改Generic.kl文件要好的多了。
其實(shí)同樣也有了新的疑問,如果DEVICE_NAME.kl中沒有聲明的鍵值,那么就不會(huì)去Generic.kl中查找,這點(diǎn)我是有點(diǎn)自己的建議的,應(yīng)該像字庫(kù)一樣,在相應(yīng)的字庫(kù)中查找不到的字都到fallback字體中查找一下。
20141018更新:
Keylayout文件中所有的「字串」必須在當(dāng)前版本系統(tǒng)的源碼的類中存在。否則系統(tǒng)會(huì)認(rèn)為該Keylayout是無效的。所以可以添加Keylayout和添加「字串」到KeyEvent要同步進(jìn)行。
總結(jié)
以上是生活随笔為你收集整理的android升级功能键,Android 按键添加转载的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android中暂停服务,Android
- 下一篇: Android访问瓦片地图 费流量,瓦片