Androidで外部キーボードのレイアウトをカスタマイズする方法(要rooted)

DSCF4446

Android 版 ATOK で日本語配列の Bluetooth キーボードをそのままの配列で使いたい!と思って日本語配列キーボード用設定ファイルを作った時のメモです。

BlueKeyboard JP なら 日本語キーボードが使えるって事は知ってるんですが、でもやっぱり Google 日本語入力とか ATOK とか Simeji とかも使いたいよねー。とかとかで。

内容が内容なので要 rooted です。ヤルなら自己責任で。

作業は Android のターミナルからでもできますが、PC から ADB を叩いた方が楽かと。

※ Android 4.1 以降では、User-installable keymaps 機能に対応するため root 不要でキーマップ変更できるようになりそうです。
http://developer.android.com/about/versions/jelly-bean.html

※2013/2/8 キーワード追加
※2012/6/28 Android 4.1 での新機能予定について言及

Android のキーボード周りの設定

関係する所だけすごく雑く書くと、キーボードからの入力は2つの設定ファイルでどの文字になるかが決まります。

キーボード → キーレイアウト(.kl) → キーキャラクターマップ(.kcm) → 文字

2つの設定ファィルの役割はこんな感じです。

(.kl):キー入力<scanCode> → キーコード<keyCode> の対応

(.kcm):キーコード<keyCode> → 文字 の対応

ちなみに、Shift|Ctrl|Alt 同時押し時の文字も .kcm で定義します。

Bluetooth / USB キーボードの Vendor ID / Product ID 確認

いきなり /system/usr/keylayout/Generic.kl とか Generic.kcm を書き換えましょう!って手もあるんですが、これらのファイルは、特定機種用のキー定義が用意されていない場合のフォールバック先なので、ここを書き換えると全キーボードに影響が出てしまいます。特殊なカスタマイズは特定キーボードでのみ有効になるよう設定するのが良いと思います。

まずは以下の方法で USB / Bluetooth キーボードの Vendor ID と Product ID を確認しておきましょう。

豪快な方は、Generic.kl / Generic.kcm を直接カスタマイズするんでしょうね。多分。

キーレイアウトファイル(.kl)の作成

/system/usr/keylayout/Generic.kl を Vendor_<vendorID>_Product_<productID>.kl というファイル名でコピーして編集します。

コピー先は同じ場所か、/data/system/devices/keylayout  でも OK。

キーレイアウトファイルは以下の形式です。

Key <scanCode> <keyCode> <modifier>

<scanCode> が押したキーの番号。

<keyCode> が次に説明するキーキャラクターマップとの橋渡しに使われる部分。Android の Home / Menu / Back / Search など特殊キーとの対応もここに記述されます。

<modifier> にはスリープ解除などの設定が記述がされるようです。

キーキャラクタマップファイル(.kcm)の作成

/system/usr/keychars/Generic.kcm を Vendor_<vendorID>_Product_<productID>.kcm というファイル名でコピーして編集します。

コピー先は同じ場所か、/data/system/devices/keychars でも OK。

キーキャラクターマップファイルは以下のようになっています。

key <keyCode> {
label: 'C'
base: 'c'
shift, capslock: 'C'
alt: '\u00e7'
shift+alt: '\u00c7'
ctrl, meta: none
}

base: が単純押下時の文字

shift とか ctrl とか alt とか書いてある所が、同時押し時の文字定義です。

これら2つの設定ファイルを頑張って作れば、あなただけのオリジナルキーマップができる。というわけです。

ノウハウ

自分のキーボードがどんなスキャンコードを吐き、Android でどんなキーイベントが発生して、どんなキーコード扱いになっているのか、を確認するには、以下記事のアプリ「KeyTest」が便利です。

また、先の2つの設定ファイルを作る上で必要な情報は本家が詳しいです。

スマホ向けキーボードの動向とか

iPhone、iPod Touch、iPad 用の Bluetooth キーボードを見ていたら、あちらも英語配列キーボード使ってるんですね。

みなさんこれで満足してらっしゃるんでしょうか。

Android スマホとかタブレットの外部キーボード仕様の内情は私も知りませんが、見た感じ OS レベルで何らかのサポートが必要な気はします。

現状だと、外部キーボードのうち、Vendor/Product ID に対応するレイアウトファイルがない場合は US English 配列キーボードにフォールバックされるんですが、これだと、ハードウェアとセット売りになっていない単体 IME が、US English 以外の配列の外部キーボードをサポートしづらいと思います。

いや、技術的にはサポート出来るんですが、これ将来仕様変わるんじゃねーの?って感じでわざわざ工数をかけてまでしてヤリたくない。という雰囲気が醸し出てます。

苦肉の策として、一部前衛的な IME では IME 内部で英字配列→日本語配列の変換をかけているものもあるんですが、でも、これってあまり綺麗じゃないような…。

OS側で外部キーボードの配列パターンを幾つか持ち、例えば JP109A なの?US101なの?ってのをOSの設定画面でユーザーに選択させて、レイアウトファイルが存在しない場合のフォールバック先はその配列になるようにする。とかできないんですかねぇ。

そうすれば、国内で発売する Android は、JP キーボードが標準。という形にできると思うんですが…。

ひょっとすると、Google さんの事ですから、もっと高尚な事を考えていて、思う所があって今の形にしているのかもしれません。

検索用キーワード:キーマップ変更,  jp109, us 101/102 ホーム, メニュー, バック, 検索

※1 PS3用キーボード CECH-ZKB1JP はAmazonでのレビューは最悪ですが、後期型はキー取りこぼしも解消しかなり良い子になりました。まだ症状に悩んでいる方はサポートデスクに相談するのがよいでしょう。スティクポインタも付いているのでマウスカーソルも使えて面白い製品です。

※2 上記一覧には英語キーボードも含まれています。用途やお使いの機種との整合、特に、お使いの機種が Bluetooth HID に対応しているかどうかについてはよく確認の上、ご購入ください。

この記事へのコメント(1件)

  1. 今さら Sony Tablet S(rooted) + ポケモンキーボードのカスタマイズまとめ | mogi2fruitsどっとねっと says:

    6年前

    […] (26) diNovoキーボードを使う | マイナビニュース ◆Androidで外部キーボードのレイアウトをカスタマイズする方法(要rooted) | … ◆Naoログ : [Android][ICONIA] ポケモンキーボード(NTR-034)のkey […]

コメントを記入