まずは情報収集と現在環境の調査。 AndroidでのBluetoothキーボードからの入力の仕組みは、塩田紳二さんのアンドロイドなう連載24回以降に詳しい。 まずは熟読。
ここから先は、Nexus 7のroot取得済で、Windows PCとADBで接続できている前提。
BTキーボードのVendor CodeとDevice Codeの確認
dumpsys input
とすると長いアウトプットが出てくるので、その中から下記のような部分を見つける。
4: Broadcom Bluetooth HID
Classes: 0x80000003
Path: /dev/input/event3
Descriptor: ec96c48a32322700b92b06ebf7f4937877cbf1bc
Location:
ControllerNumber: 0
UniqueId:
Identifier: bus=0x0005, vendor=0x05ac, product=0x0239, version=0x001b
KeyLayoutFile: /system/usr/keylayout/Vendor_05ac_Product_0239.kl
KeyCharacterMapFile: /system/usr/keychars/Generic.kcm
ConfigurationFile:
HaveKeyboardLayoutOverlay: true
ここから以下のことが分かる。
- Vendor Codeは「05ac」、これはアップルのCode。
- Product Codeは「0239」、これはおそらくWireless KeyboardのCode。
- 適用されるklファイルは「/system/usr/keylayout/Vendor_05ac_Product_0239.kl」。
- 適用されるkcmファイルは「/system/usr/keychars/Generic.kcm」。
どうやら、ANKER ウルトラスリム・ミニ Bluetooth 3.0 ワイヤレスキーボードはアップルのキーボードをエミュレートしているらしい。
KLファイルとKCMファイルを手元にコピーしておいて、先にキーボードの各キーを押した時のLKC(Linux Key Code)を調べる。
各キーをおした時のLKCの調査
まずはBTキーボードがどのイベントデバイスに割り当てられているかをチェック。
$ getevent
add device 1: /dev/input/event3
name: “Broadcom Bluetooth HID”
add device 2: /dev/input/event1
name: “lid_input”
add device 3: /dev/input/event0
name: “elan-touchscreen”
add device 4: /dev/input/event2
name: “gpio-keys”
イベントデバイスが「/dev/input/event3」と分かったので、あとは、
$ getevent /dev/input/event3
を実行して、根気よくキーを押してはLKCを記録する。 例えば「a」を押して、離すと、以下の6行が表示されるので「001e」を記録する。
0004 0004 00070004
0001 001e 00000001
0000 0000 00000000
0004 0004 00070004
0001 001e 00000000
0000 0000 00000000
こうやって調べた結果は下図の通り。各キーの上段の青字が16進、下段の赤字が10進でのLKC。最上段のキーは(そのまま押した時)/(「fn」キーと一緒に押した時)の値。
さあ、これでKLファイルとKCMファイルに手を加える準備が整った。