キーボードとキーマップの対応


20130624keyboad_keymap_system 20130624keyboad_keymap_app

システム設定画面の「言語と入力」では、外部キーボードとキーマップの対応が表示されます。
これをアプリでも実現します。
InputManager のソースを読むと、getCurrentKeyboardLayoutForInputDevice という非公開のメソッドが用意されています。
これを リフレクション を利用して、実行します。

ソースコードは code.google にて公開しています。

参考
リフレクションをつかってメソッドを呼び出す – Tech Booster


英語キーボードと日本語キーボードの違い


20130617keyboard_109

キーボードは、キーの数で分類されます。

(1) 101キーボード
英語キーボードとか、USキーボードと称されるものです。

(2) 106キーボード
日本語キーボードと称されるものです。
101キーボードに下記の5個が追加されています。
「変換」「無変換」「カタカナ/ひらがな」「半角/全角」「@」

Shiftキーを押したときのキーの意味も変更されています。
英語キーボードでは、1234567890 をシフトしたときは、! @ # $ % ^ & * ( ) になります。
日本語キーボードでは、! ” # $ % & ‘ ( ) なし となります。
その他の記号キーも微妙に違います。
(なぜここを変更したのか疑問ですね)

(3) 109キーボード
Windowsキーボードと称されるものです。現在はこれが主流です。
106キーボードに下記の3個が追加されています。
「Windows」2個と「メニュー」

参考
キー配列 – wikipedia


キーボードの全角半角キー


20130616ime_google

キーボードの全角半角キーの振る舞いは、日本語IMEにより異なります。
キーマップを変更しても、全角半角キーが押されたよと通知するだけです。
全角半角キーが押された後の処理は、日本語IMEが担当しています。

(1) △ Google日本語 (GalaxyNexus)
英語モードのとき、全角半角キーで、変化なし。
端末のスクリーンにタッチすると、日本語モードに切替る。
日本語モードのとき、全角半角キーで、無変換の状態のまま、全角と半角が切替る。
F8キー、F9キーで、変化なし。
スペースキーで、変換候補が表示され、Enterキーで確定する。
変換キーで、変化なし。

(2) × Wwn Keyborad Lab (GalaxyNexus)
英語モードのとき、全角半角キーで、変化なし。
端末のスクリーンにタッチすると、日本語モードに切替る。
日本語モードのとき、全角半角キーで、変化なし。
F8キーで半角に、F9キーで全角になる。
変換キーもしくはスペースキーで、変換候補が表示され、Enterキーで確定する。

(3) × simeji (GalaxyNexus)
英語モードのとき、全角半角キーで、変化なし。
端末のスクリーンにタッチすると、日本語モードに切替る。
日本語モードのとき、全角半角キーで、変化なし。
F8キー、F9キーで、変化なし。
スペースキーで、変換候補 (半角の候補も) が表示され、Enterキーで確定する。
変換キーで、変化なし。

(4) ○ iWwn IME (Nexus10)
英語モードのとき、全角半角キーで、日本語モードに切替る。
日本語モードのとき、全角半角キーで、英語モードに切替る。
F8キーで半角に、F9キーで全角になる。
スペースキーで、変換候補が表示され、Enterキーで確定する。
変換キーで、変化なし。

(5) ○ Samsung日本語キーパッド (GalaxyS3 SC-03D)
英語モードのとき、全角半角キーで、日本語モードに切替る。
日本語モードのとき、全角半角キーで、英語モードに切替る。
F8キーで半角に、F9キーで全角になる。
スペースキーで、変換候補が表示され、Enterキーで確定する。
変換キーで、変化なし。


日本語用のキーマップを追加する


20130611keymap_japanese_106

日本語用のキーマップ は Linux redhat から拝借します。
/lib/kbd/keymaps/i386/qwerty/jp106.map.gz
jp106.map と 英語用の keyboard_layout_english_us.kcm を元に、日本語用の kcm ファイルを作成します。

変更方法
(1) キーレイアウトを変更する
英語の LEFT_BRACKET の位置にあるキーは、日本語では AT になる。
LEFT_BRACKET のキー番号は 26番で、キーレイアウト・ファイル qwerty.kl に定義されている。
下記のように記述する

map key 26  AT

(2) キーを追加する
KeyEvent には日本語の YEN や RO が定義されています。
( それなら日本語キーマップも用意して欲しいものだ )
下記のように記述する

key YEN {
    label:                              '¥u00a5'
    base:                               '¥u00a5'
    shift:                              '|'
}

ソースコードは code.google にて公開しています。

補足
日本語用のキーマップは、Google Play で配布されています。
それらを使うほうが手っ取り早いです。
(1) KCM for 日本語106/109キーボード
(2) 日本語106/109キーボードレイアウト

参考
Key Character Map Files
Key Layout Files
Android4.1で日本語配列キーボード(USB/Bluetooth)を使えるようにする
KCM for Japanese 106/109 Keyboard


キーマップを追加する


20130610keymap_english_us

Android 4.1 (API 16) から、User-installable keymaps 機能が追加されました。
AOSP にソースコードが公開されています
platform/frameworks/base/packages/InputDevices/

少しだけ解説を。
src に、BroadcastReceiver を継承した InputDeviceReceiver.java を記述します。
res/row に、kcm 形式のキーマップを配置します。
res/xml に、名称と kcm の対応表 keyboard_layouts.xml を配置します。
AndroidManifest.xml の receiver に InputDeviceReceiver を記述します。
receiver の meta-data に keyboard_layout を記述します。

キーマップを追加する。
手抜きをして、既存の英語用キーマップを使います。
keyboard_layout_english_us.kcm
名称は区別がつくように変更します。
English (US) – ohwada

ソースコードは code.google にて公開しています。

参考
JBで日本語キーボードマップ


キーボードが接続されたことを検出する


0130606input_manager_sample_2

Android 4.1 (API 16) から InputDeviceListener が追加されました。
キーボードなどの入力デバイスが接続されると、InputDeviceListener#onInputDeviceAdded に デバイスID が通知されます。

留意点
キーボードが接続されると、Activity が再起動されます。
これを抑止するには、AndroidManifest.xml の activity に下記を追加します。

android:configChanges="keyboard|keyboardHidden" 

ソースコードは code.google にて公開しています。

参考
JBで追加されたFrameworkの機能InputManagerについて
AndroidManifest.xml − ソフトウェア技術ドキュメントを勝手に翻訳


入力デバイスの一覧を取得する


20130605input_manager_sample_1

Android 4.1 (API 16) から InputManager が追加されました。
入力デバイスの一覧を取得するには、InputManager#getInputDeviceIds を使用します。

ソースコードは code.google にて公開しています。

参考
JBで追加されたFrameworkの機能InputManagerについて


Android に Bluetooth キーボード を接続する


20130603bluetooth_keyboard

Android 3.1 から、Bluetooth HID プロファイルに対応し、Bluetooth HID キーボードが使えるようになったらしい。
Android の公式記事のどこにもそういう記述がないが。

手持ちの端末で試してみた。
最初にペアリングが必要です。

いずれもOK
(1) ○ Arrows Tab F10D (3.2)
(2) ○ Galaxy S3 (4.1.2)
(3) ○ Galaxy Nexus (4.2.1)
(4) ○ Nexus 10 (4.2.2)

補足
(1) HID プロファイルの対応には、機種依存性があります。
Android OS搭載スマートフォン、タブレットへの対応情報

(2) SPP プロファイル のキーボードもあります。
エレコム、Androidで利用できる折りたたみ式Bluetoothキーボード

(3) アプリで独自に対応しているものあります。
BT接続できるSimeji

参考
Bluetoothマウスやキーボードを活用するとなかなか捗る!


USB 日本語 キーボード


20130602usb_keyboard_japanese

Android 4.1 から、User-installable keymaps 機能が追加された。

日本語用の keymaps が Google Play で配布されている。
日本語106/109キーボードレイアウト

手持ちの端末で試してみた。
(1) × Arrows Tab F10D (3.2)
バージョンが対応していない

(2) △ Galaxy S3 (4.1.2)
デフォルトで、半角・全角キーを識別する。
全角モードのときは、日本語キーボードとして動作する。
「日本語106/109キーボードレイアウト」のインストールが出来るが、選択する画面がないため、使用できない。

(3) ○ Galaxy Nexus (4.2.1)
(4) ○ Nexus 10 (4.2.2)

参考
nexus 7 (android 4.2) でUSBキーボード(109キーボード)を有線接続する


Android に USB キーボード を接続する


20130601-usb_keyborad

Android 3.1 から、USBホスト に対応し、USBキーボードが使えるようになった。

変換ケーブル (MicroBオスとAメス) が必要です。

手持ちの端末で試してみた。
いずれもOK
(1) ○ Arrows Tab F10D (3.2)
(2) ○ Galaxy S3 (4.1.2)
(3) ○ Galaxy Nexus (4.2.1)
(4) ○ Nexus 10 (4.2.2)