android升级功能键,Android 按键添加转载
按鍵從Linux到Android
現在的普通按鍵也集成到Linux Input子系統中了,只需要把按鍵對應的IO端口配置好,按鍵就可以工作了。所以一般提供的BSP(或者叫作解決方案)中,已經完善了按鍵驅動。關鍵是快速的了解按鍵的映射。所以這里不作源碼級分析。源碼分析可以參考這里:《基于S3C2440的Linux-3.6.6移植——按鍵驅動》
Linux按鍵的掃描碼
掃描碼是Linux Input系統中規定的碼值,好比PC鍵盤上每個鍵的鍵值。都是數字。
在設備上輸入一下命令后,按鍵可以探測到得到每個按鍵的掃描碼Code.
root@android:/ # busybox hexdump /dev/input/event0 ?(20141009更:同樣可以使用Android中專用的getevent命令)
Android 與 Linux分隔線
Android也定義了一套碼,叫作鍵盤碼,通過一個/system/usr/keylayout/來將兩套碼對應起來。目前調試的是全志的A10的BSP包。這里用的是sun4i-keyboard.kl。(如果沒有其它*.kl,則是默認的qwerty.kl)
Linux上傳的Code是0x00d9對應10進制217,打開sun4i-keyboard.kl后可以看到映射關系:
可以看出對應的是BRIGHTNESS_DOWN,Android中只認BRIGHTNESS_DOWN(這里成為字串),Linux中的Code至此為止。 ?(在Android源碼中也能找到這個映射文件可以依名字搜索找到其位置)
Android源碼中添加該按鍵
如果Android中frameworks/base/core/java/android/view/KeyEvent.java有要添加的功能,比如HOME,則只修改*.kl映射按鍵即可修改或者添加映射。
如果KeyEvent.java中本沒有要添加按鍵的功能,就可以在KeyEvent.java的KeyEvent類最后依葫蘆畫瓢添加:
如不知道功能的鍵盤碼是多少可以到這里找到。
然后根據KeyEvent類最后的添加鍵提示,每個文件都添加上:
// 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應用程序就可以通過onKeyDown檢測到了檢測到這個按鍵了。至于這個按鍵具體功能的實現比如這里的
BRIGHTNESS_DOWN(亮度減)功能,要修改frameworks/base/policies/base/phone/com
/android/internal/policy/impl/PhoneWindowManager.java。根據具體需求實現。
關于重啟(Reset)鍵
這個“按鍵”一般是通過直接連接CPU芯片上的復位實現重啟功能的。這個直接操作的是CPU,Android(或者Linux)是無法去檢測和控制這個“按鍵”的。
20140306更新:
今天再次遇到同樣的問題,為Android添加按鍵。平臺是rk30,Android版本是4.2.2。遇到了一些新問題和新的挑戰,花費一天時間添加完畢。且做了完整的規劃。以CAMERA和OTHAER鍵為例。
1.確認內核層的鍵值碼
進入adb?shell,使用toolbox中的getevent工具:type?code?value。主要看type為1時的code值是多少。
2.確認*.kl文件
確認方法是交換V+和V-的鍵值碼,結果是:自定義:rk29-keypad.kl,一般鍵盤是:Generic.kl,qwerty.kl已經被Generic.kl取代。
3.確認如何修改*.kl會起效
重啟后
4.確認兩個kl區別
從里邊內容可以大概分別出來rk29-keypad.kl決定新添加的,Generic.kl包含了所有的鍵,優先級低于rk29-keypad.kl,也就是兩個kl文件可以同定義一個鍵值,但會以rk29-keypad.kl首先為準(如果rk29-keypad.kl中定義了,但是字串Android層沒有處理比如”key?114???FUCK”,”FUCK”上層并沒有處理,還是會去處理Generic.kl中的對應鍵串),所以新添加的鍵值都添加到rk29-keypad.kl中,Generic.kl是建議不動的。
注意事項:kl定義的鍵串必須是Android層進行處理的,如果有出現沒有處理的鍵串會導致整個鍵盤都不能使用。如果是鍵盤只會讀Generic.kl,而不會讀rk29-keypad.kl。所以如果是一個特殊的鍵盤,那么要動手修改Generic.kl。這個是實踐結果,具體源碼還沒有找到。
5.先打通一個已經半通的CAMERA
CAMERA是上層已經完善的,在kl文件將新按鍵映射到的CAMERA上(key?132?CAMERA),然后用一個apk來驗證接收。結果OK。
6.打通整個通道-添加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是在添加其它文件后執行make?update-api編譯自動修改的結果。關于Android上層在哪里解析的這個兩個kl文件,要等下次更新了。
20140315更新:
很快又用到這里的信息,今天是添加一個紅外遙控的鍵值,結果也得修改Generic.kl,修改rk**.kl不行。就簡單的記錄到這里。
20141010更新:
Android上層也在不斷的更新,4.0/4.2的時候亮度的調節還是要自己添加按鍵來實現,4.4中KeyEvent.java已經有了這兩個按鍵鍵值,對應Generic.kl中已經已經有了對應到Linux內核的標準亮度調試鍵值。
From:
不僅可以驗證內核發出的輸入事件,同樣不可以模擬輸入事件到Android上層。如下命令模擬「亮度減」的按鍵。
$?adb?shell?input?keyevent?BRIGHTNESS_DOWN
執行后就可以Android系統可以響應出來?調整亮度。就可以說明Android上層已經暢通無阻了。
根據以上分析,那么在Android4.4中配置內核中只上報標準的內核亮度鍵值KEY_BRIGHTNESSDOWN/KEY_BRIGHTNESSUP就可以正常的對接了。
但是我同樣遇到了亮度按鍵不能響應的問題,通過上下觀察值都對應上去的,但是卻不能正常響應。
經實驗,將如下「亮度鍵值」添加到rk29-keypad.kl中可以正常響應了:
key?224???BRIGHTNESS_DOWN
key?225???BRIGHTNESS_UP
事后根據Android官方教程Key?Layout?Files分析它會優先讀取/system/usr/keylayout/DEVICE_NAME.kl按鍵映射文件。而設備上的物理按鍵的設備名正好是「rk29-keypad」,可以通過getevent查看出來。
這也解釋了20140315添加紅外遙控器的鍵值時不能添加到rk29-keypad.kl中,而添加到Generic.kl可以正常。因為Generic.kl的屬于fallback級別的映射文件。針對遙控器正確的方法同樣新建立一個DEVICE_NAME.kl的映射文件。比如遙控器設備名為rkxx-remotectl那么新建一個rkxx-remotectl.kl映射文件,內容是和Generic.kl中類似的每個鍵值對應的鍵碼。這個方法要遠比直接修改Generic.kl文件要好的多了。
其實同樣也有了新的疑問,如果DEVICE_NAME.kl中沒有聲明的鍵值,那么就不會去Generic.kl中查找,這點我是有點自己的建議的,應該像字庫一樣,在相應的字庫中查找不到的字都到fallback字體中查找一下。
20141018更新:
Keylayout文件中所有的「字串」必須在當前版本系統的源碼的類中存在。否則系統會認為該Keylayout是無效的。所以可以添加Keylayout和添加「字串」到KeyEvent要同步進行。
總結
以上是生活随笔為你收集整理的android升级功能键,Android 按键添加转载的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android中暂停服务,Android
- 下一篇: Android访问瓦片地图 费流量,瓦片