今回は、Androidへ入力するキーの情報の作成の仕方を説明します。
キー情報の作成は、Androidソースコード環境のBuildが必要です。TechBoosterでは、AndoridソースコードBuildに関する記事を取り扱ってます。
Androidのソースコードを入手する
Androidのソースコードをビルドする
Build環境が整っていない方は、本エントリを読む前に上記のエントリに目を通し環境を整えるといいでしょう。
キー情報の設定には2つの項目があります。
・keylayoutファイルの設定変更
・keycharsファイルの設定変更
以下続きにて、詳細な設定方法に触れていきます。
■keylayoutファイルの設定変更
keylayoutファイルとは、AndroidOSがデバイス(ハードウェア)から受信したSCANCODEから、
どの文字を出力するかを結び付けるマッピング情報を持ったファイルです。
SCANCODEはハードウェアにより異なり、静的なものです。
JavaSourceCode内で、以下のMethodを使用することでSCANCODEを確認することができます。
KeyEvent#getScanCode()
Emulator環境では、qwerty.klファイルが読み込まれているため、以下がロードされます。
ANDROID=ソースコードのHEAD $ANDROID/sdk/emulator/keymaps/qwerty.kl
様々なキーボードが接続されている環境では、キーボード毎に読み込まれるkeylayoutファイルは異なります。
AndroidOSはKeyInputデバイスの接続を検知した後、デバイス名に結びついた <デバイス名>.kl ファイルを探します。もし用意されていなかった場合には、 qwerty.kl ファイルを使用する様になっています。
qwerty.kl
.........省略 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 省略............
<デバイス名>.klファイルの検索時に”スペース”の部分は”_”として検索される様になってるんだよ。 気をつけようね! |
書式は左からスペースを挟み以下を記述する。
要素 | 説明 |
key <数字> | SCANCODEを記入する |
KEYCODE | AndroidOSが定義しているKEYCODE ※1 |
FLAG | WAKE|WAKE_DROPPED等のフラグを記入 ※2 |
注釈)
※1 AndroidOSが定義しているKEYCODEは以下ファイルを確認します。
新規KEYCODEを追加したい場合は、本ファイルに記載し別途Framework内に処理を追加することで対応できます。
./frameworks/base/core/java/android/view/KeyEvent.java
※2 Flagに記入しているWAKE|WAKE_DROPPEDの意味
WAKE/WAKE_DROPPEDはどちらもサスペンド状態からの復帰を示します。
WAKE | サスペンド状態からの復帰後、アプリケーションへキーイベントが送信される |
WAKE_DROPPED | サスペンド状態からの復帰後、アプリケーションへキーイベントが送信されない |
○発行されるKEYCODEの編集
では、keylayoutファイルを編集し、動作を変更させてみましょう。
以下ファイルを適当なエディタで開き、
/sdk/emulator/keymaps/qwerty.kl
SCANCODE158のBACK指定をHOMEに変更してみます。
key 158 BACK WAKE_DROPPED
↓↓↓
key 158 HOME WAKE_DROPPED
変更が終わった後に、Makeを行いEmulatorを起動します。
Emulatorの右側のBACKボタンを押下してみましょう。
HOMEボタンの挙動を行う様になっていることと思います。
□番外編:Emulatorの起動方法
Androidのソースコードをビルドするの内容の通り、コ
マンドラインからの起動でもよいですが、以下の様な起動方法もあります。
※SDKの環境を壊すため、必ずバックアップを行う様にしてください。
Make完了後、以下のディレクトリには、IMGファイルが3種生成されます。
$ export ANDROID=ソースコードのHEAD $ ls $ANDROID/out/target/product/generic/ *.img ramdisk.img system.img userdata.img
3種のIMGファイルの内、system.imgを以下ディレクトリにコピーします。
※コピーを行う前にSDK内のsystem.imgファイルはバックアップをとること。
$ export ANDROID_SDK=AndroidSDKのHEAD $ mv $ANDROID_SDK/platforms/android-9/images/system.img _system.img_org $ cp -af $ANDROID/out/target/product/generic/system.img $ANDROID_SDK/platforms/android-9/images/
コピーの実施後、AVD ManagerからEmulatorを作成することで、自己BuildバイナリのEmulatorを起動できます。
■keycharsファイルの設定変更
keycharsファイルは、keylayoutファイルにて設定されているKEYCODEにおいて、Shift入力時、ALT入力時などに何を入力するかを決めるファイルです。
keycharsファイルに関しても、ロードのされ方はkeylayoutファイルと同様であり、AndroidOSは<デバイス名>.kcm.binファイルを探した後に、見つからない場合にはqwerty.kcm.binをロードします。
keylayoutファイルと違い、keycharsファイルはバイナリ化されますので、編集は hoge.kcm ファイルの状態で行わなければいけません。
Emulator環境で使用されている、keycharsファイルは以下になります。
ANDROID=ソースコードのHEAD $ANDROID/sdk/emulator/keymaps/qwerty.kcm
qwerty.kcm
# keycode display number base caps fn caps_fn 0 '0' '0' '0' ')' ')' ')' 1 '1' '1' '1' '!' '!' '!' 2 '2' '2' '2' '@' '@' '@' 3 '3' '3' '3' '#' '#' '#'
keycodeの項目は、上記keylayoutファイルで説明したKEYCODEと一致します。
「caps」はSHIFT押下時、「fn」はALT押下時、「caps_fn」はSHIFT+ALT押下時に出力される文字になります。
○SHIFT/ALT押下時の文字出力の編集
では、keycharesファイルを編集しSHIFT/ALT押下時の挙動を変更してみます。
$ export ANDROID=ソースコードのHEAD $ emacs $ANDROID/sdk/emulator/keymaps/qwerty.kcm
2キーを押下する場合、SHIFT押下時は”ダブルクォーテーション”、ALT押下時は”@”、SHIFT+ALT押下時は”*”を入力する様に変更します。
2 '2' '2' '2' '@' '@' '@'
の行を以下の様に編集します。
2 '2' '2' '2' '"' '@' '*'
編集後、Makeを実行し、Emulatorを起動します。
右側に表示されている、キーボードにおいて、以下の様に入力出来ることと思います。
2 → 2
SHIFT(↑)押下後 2 → ”(ダブルクォーテーション)
ALT押下後 2 → @
SHIFT(↑)押下 ALT押下 2押下 → *
長々とお疲れ様でした。