Bluetooth接続の英語キーボードを刻印通りに打つ

以前、写真のASUS MeMO Pad HD 7 (ME173X)対応のジャケット付きBluetoothキーボードを購入したのだが、キートップの刻印通りに打てないキーが存在する。

この問題を解決した時の経緯を以下に記載する。

なお、以下に記載のコマンドはAndroid上のTerminal IDEのコンソールで実行した。
コマンドの実行に必要なroot権限はSuperSUの「su」コマンドで取得した。

バイス名の取得

バイス名は設定の「言語と入力」の「物理キーボード」に以下が表示されている。

  hid-keyboard

バイス情報の取得

バイス情報は「dumpsys input」コマンドで得られる。

INPUT MANAGER (dumpsys input)

Event Hub State:
  BuiltInKeyboardId: -2
  Devices:
    7: hid-keyboard
      Classes: 0x0000014b
      Path: /dev/input/event5
      Descriptor: e6829a71d080dbf7cc1317c4cc5515a23611afd2
      Location: 
      UniqueId: 
      Identifier: bus=0x0019, vendor=0x0000, product=0x0000, version=0x0000
      KeyLayoutFile: /system/usr/keylayout/hid-keyboard.kl
      KeyCharacterMapFile: /system/usr/keychars/Generic-ja_JP.kcm
      ConfigurationFile: /system/usr/idc/hid-keyboard.idc
      HaveKeyboardLayoutOverlay: true

キーコードの取得

上記「デバイス情報」の「Path」から、不正な文字が表示されるキーのキーコードを「getevent /dev/input/event5」コマンドで取得した。

刻印 表示 キーコード(10進数)
[ @ 26
] [ 27
\ ] 43
| } 42 43
{ @ 42 26
} { 42 27
~ なし 42 41
` 半角/全角 41

※上記の「42」は左シフトキー

キーと文字の割り当て

上記「デバイス情報」の「Generic-ja_JP.kcm」を見ると、以下の記述があるため、今回の現象が発生していることが分かる。

map key 26 AT
map key 27 LEFT_BRACKET
map key 41 ZENKAKU_HANKAKU
map key 43 RIGHT_BRACKET

IDCファイルの変更

上記「デバイス情報」の「hid-keyboard.idc」を以下のように変更した。

【変更前】
keyboard.layout = hid-keyboard
keyboard.characterMap = Generic-ja_JP

【変更後】
keyboard.layout = hid-keyboard
keyboard.characterMap = Generic

実際の変更は以下の手順で行う。

  1. 「mount /emmc@android /system -o remount,rw」コマンドで「/system」を書き込み可能に変更する。
  2. 「hid-keyboard.idc」を書き換える。
  3. タブレットを再起動する。

「User-installable keymaps」について

Android 4.1から、キーと文字の割り当てをユーザが定義できる仕組みが追加され、ユーザ定義は設定の「言語と入力」の「物理キーボード」をタップすると表示される「キーボードレイアウトの選択」で指定することができる。
今回の問題にはこの方法で対応しようか迷ったのだが、「Generic-ja_JP.kcm」で一旦定義されたものを、再度元の「hid-keyboard.kl」で定義されたものに戻すのが納得できなかったので、前述のIDCファイルを変更する方法を採用した。