清澄 世界

關於部落格
三朵花的爸 第四朵花的他
  • 12380

    累積人氣

  • 0

    今日人氣

    0

    訂閱人氣

Android key events for dialling

本文收錄Android與key event相關的檔案位置,並在trace source code的過程中去探究如何更改原始碼,使Dialer UI 能與不同硬體平台的qwerty key做matching: Android將處理key events的函式以及keycode定義在./frameworks/base/core/java/android/view/KeyEvent.java 中,觀察原始碼可以發現Android自行定義了新的keycodes,這與Linux中input.h所定義的keycode value有所不同,合理的猜測其中必然做過transfer的動作,這才能讓Kernel與Android middle ware以及AP相接合。若們需要在Android system中加入一個新的keycode,所需更動的檔案以及函式可能有以下幾個: -isSystem() -include/ui/KeycodeLabels.h -tools/puppet_master/PuppetMaster/nav_keys.py -apps/common/res/values/attrs.xml -commands/monkey/Monkey.java 本文主要目的是要porting Andorid到不同的硬體平台中,使得qwerty keypad可以在撥打電話時正常運作。筆者之前使用的方法是去更改Linux driver,使用combo key的方式讓硬體改變傳送給kernel的keycode,舉例來說,若是我按了function key + Q則回傳1,若是我按了function key + W則回傳2,依此類推鍵盤的Q、W、E、R、T、Y依序可以代表數字鍵1、2、3、4、5、6...等等,但這個作法會帶給使用者負擔,必須使用兩個手指頭才可撥號(不使用支援Touch screen模擬鍵盤的情況下),所以在接下來的介紹中,我想找出如何更改Android code,使得可以自行讓系統在撥號時自動幫我把Q、W、E、R、T、Y對應到1、2、3、4、5、6。 觀察了Android檔案,我們可以發現有兩種檔案與鍵盤行為有密切的關聯,第一種為 *.kl檔,第二種為*.kcm檔: (1).kl檔的內容: (以預設的qwerty.kl為例) key 399 GRAVE key 2 1 key 3 2 key 4 3 key 5 4 key 6 5 key 7 6 key 8 7 key 9 8 key 10 9 key 11 0 key 158 BACK WAKE_DROPPED key 230 SOFT_RIGHT WAKE key 60 SOFT_RIGHT WAKE key 107 ENDCALL WAKE_DROPPED key 62 ENDCALL WAKE_DROPPED key 229 MENU WAKE_DROPPED key 139 MENU WAKE_DROPPED key 59 MENU WAKE_DROPPED key 127 SEARCH WAKE_DROPPED key 217 SEARCH WAKE_DROPPED key 228 POUND key 227 STAR key 231 CALL WAKE_DROPPED key 61 CALL WAKE_DROPPED key 232 DPAD_CENTER WAKE_DROPPED key 108 DPAD_DOWN WAKE_DROPPED key 103 DPAD_UP WAKE_DROPPED key 102 HOME WAKE key 105 DPAD_LEFT WAKE_DROPPED key 106 DPAD_RIGHT WAKE_DROPPED key 115 VOLUME_UP key 114 VOLUME_DOWN key 116 POWER WAKE key 212 CAMERA key 16 Q key 17 W key 18 E key 19 R key 20 T key 21 Y key 22 U key 23 I key 24 O key 25 P key 26 LEFT_BRACKET key 27 RIGHT_BRACKET key 43 BACKSLASH 其內容為linux kernel與android所用到的Keys的mapping,基本上我們沿用這個設定,因為他已經包含了大部分可能使用到的input key event。 所以我們要做的是新增一個與我們keyboard device相同名稱的.kl檔(內容與qwerty.kl相同),例如QQ_keypad.kl,而目錄位置可以參考source tree中的tuttle2.kl以及相關的Android.mk檔案。 (2).kcm檔的內容: (以預設的qwerty.kcm為例) [type=QWERTY] # keycode display number base caps fn caps_fn A 'A' '!' 'a' 'A' '!' 0x00 B 'B' '-' 'b' 'B' '-' 0x00 C 'C' '/' 'c' 'C' '/' 0x00E7 D 'D' '#' 'd' 'D' '#' 0x00 E 'E' '3' 'e' 'E' '3' 0x0301 F 'F' '$' 'f' 'F' '$' 0x00A5 G 'G' '%' 'g' 'G' '%' '_' H 'H' '&' 'h' 'H' '$' '{' I 'I' '8' 'i' 'I' '8' 0x0302 J 'J' '*' 'j' 'J' '*' '}' K 'K' '(' 'k' 'K' '(' '~' L 'L' ')' 'l' 'L' ')' '`' M 'M' '?' 'm' 'M' '?' 0x00 N 'N' ''' 'n' 'N' ''' 0x0303 O 'O' '9' 'o' 'O' '9' 0x00 P 'P' '0' 'p' 'P' '0' 0x00 Q 'Q' '1' 'q' 'Q' '1' 0x0300 R 'R' '4' 'r' 'R' '4' 0x20AC S 'S' '@' 's' 'S' '@' 0x00DF T 'T' '5' 't' 'T' '5' 0x00A3 U 'U' '7' 'u' 'U' '7' 0x0308 V 'V' '+' 'v' 'V' '+' '^' W 'W' '2' 'w' 'W' '2' 0x00 X 'X' ':' 'x' 'X' ':' 0xEF00 Y 'Y' '6' 'y' 'Y' '6' 0x00A1 Z 'Z' ';' 'z' 'Z' ';' 0x00 SHIFT_LEFT 0x00 '+' 0x00 0x00 '+' 0x00 # on pc keyboards COMMA ',' ',' ',' ';' ';' '|' PERIOD '.' '.' '.' ':' ':' 0x2026 AT '@' '0' '@' '0' '0' 0x2022 SLASH '/' '/' '/' '?' '?' '' SPACE 0x20 '0' 0x20 0x20 '0' 0xEF01 ENTER 0xa '@' 0xa 0xa '@' 0xa TAB 0x9 0x9 0x9 0x9 0x9 0x9 0 '0' '0' '0' '0' 0x20 0x20 1 '1' '1' '1' '1' '1' '1' 2 '2' '2' '2' '2' '2' '2' 3 '3' '3' '3' '3' '3' '3' 4 '4' '4' '4' '4' '4' '4' 5 '5' '5' '5' '5' '5' '5' 6 '6' '6' '6' '6' '6' '6' 7 '7' '7' '7' '7' '7' '7' 8 '8' '8' '8' '8' '8' '8' 9 '9' '9' '9' '9' '9' '9' 我們可以發現同一個Qwerty key在android系統中有好幾種模式,而Dailer所使用的就是其中的number mode,所以只需要建立一個QQ_keypad.kcm檔,並將mode欄位改成我們想要的即可。 例如: [type=QWERTY] # keycode display number base caps fn caps_fn A 'A' '!' 'a' 'A' '!' 0x00 B 'B' '-' 'b' 'B' '-' 0x00 C 'C' '/' 'c' 'C' '/' 0x00E7 D 'D' '#' 'd' 'D' '#' 0x00 E 'E' '3' 'e' 'E' '3' 0x0301 F 'F' '$' 'f' 'F' '$' 0x00A5 G 'G' '%' 'g' 'G' '%' '_' H 'H' '&' 'h' 'H' '$' '{' I 'I' '8' 'i' 'I' '8' 0x0302 J 'J' '*' 'j' 'J' '*' '}' K 'K' '(' 'k' 'K' '(' '~' L 'L' ')' 'l' 'L' ')' '`' M 'M' '?' 'm' 'M' '?' 0x00 N 'N' ''' 'n' 'N' ''' 0x0303 O 'O' '9' 'o' 'O' '9' 0x00 P 'P' '0' 'p' 'P' '0' 0x00 Q 'Q' '1' 'q' 'Q' '1' 0x0300 R 'R' '4' 'r' 'R' '4' 0x20AC S 'S' '@' 's' 'S' '@' 0x00DF T 'T' '5' 't' 'T' '5' 0x00A3 U 'U' '7' 'u' 'U' '7' 0x0308 V 'V' '+' 'v' 'V' '+' '^' W 'W' '2' 'w' 'W' '2' 0x00 X 'X' ':' 'x' 'X' ':' 0xEF00 Y 'Y' '6' 'y' 'Y' '6' 0x00A1 Z 'Z' ';' 'z' 'Z' ';' 0x00 SHIFT_LEFT 0x00 '+' 0x00 0x00 '+' 0x00 這樣的設定即可讓Q->1,W->2,E->3...依此類推。 我們可以同時存在很多個.kl以及.kcm檔案,系統會自己依照device name去選擇所需的對應檔,若是沒有match的設定檔,則使用預設的qwerty.kl以及qwerty.kcm!
相簿設定
標籤設定
相簿狀態