【コラム】

塩田紳二のアンドロイドなう

26 diNovoキーボードを使う

26/125

今回は具体的にキーボードのkey layoutファイル(以下KLファイルと略す)やkey character mapファイル(同KCMファイル)を作ってみることにしよう。機材として使ったのは前回と同じくLogicoolのdiNove Mini(写真01)とGalaxy Nexusである。前回の例のように、dumpsysコマンドでベンダーコードなどを調べておく。そこからこのキーボードに自動割り当てされるファイル名を以下のように決定した。

写真01: 今回、実際にKLとKCMを作ったのはロジクール社のdiNovo Mini。bluetoothのコンパクトキーボード

Vendor_046d_Product_b30c

さて、ユーザーがあとからKLファイルなどを作成した場合、/Systemディレクトリ以下に置くのには手間がかかる。なぜなら、ここは標準でリードオンリーでマウントされており、書き込む必要があるたびにremountする必要があるからだ。そこで、/data/system/devicesディレクトリ以下にkeylayout、keycharsディレクトリを作り、ここにファイルを置くことにする。この作業にはroot権限が必要だ。また、/system以下にあるkeylayoutディレクトリなどは、標準ではsystemグループのユーザーsystemの所有となっており、またパーミッション設定も行われている。今回は、ディレクトリの設定には、776を、ファイル自体には644を設定した。ファイルを作成したらchownやchmodコマンドで設定を行っておく。他のパーミッションやオーナーでのテストは行っていないため、エラーなどの場合には、作成したディレクトリやファイルのオーナーやパーミッションを確認されたい。

まず、KLファイルだが、システム側にlogitechのキーボード用のファイルがあったので、これをベースにファイルを書き換えた。また、KCMファイルについては、汎用のGeneric.kcmファイルをベースに書き換えを行った。また、idcファイルは作成せず、それぞれのファイル名をデバイス名表記とすることで、自動的に割り当てが行われるようにした。

なお、この自動割り当てだが、dumpsysコマンド、

dumpsys input

を使うと、デバイスごとにどのファイルを使っているかを表示できる(図01)。ファイルにエラーなどがあった場合、Generic.kcm、Generic.klファイルなどが使われることになるので注意が必要だ。もし試行錯誤的にファイルを作るのであれば、ときどきdumpsysコマンドで、ファイルの割り当てを調べるようにする。なお、接続が開始されると、ファイルが読み込まれ、メモリ上にデータが展開されて利用されるようなので、ファイルを変更したら一回Bluetoothをオフにして接続を切り、再度接続して、修正したファイルを読み込ませる。これをやらないと、いくらファイルを直しても動作に何も影響しないので注意されたい。

・図01

    27: Logitech diNovo Mini
      Classes: 0x8000012b
      Path: /dev/input/event6
      Descriptor: 97dd8f6772c63f793af21b2409d71addec8256af
      Location: 9C:02:98:E4:06:9E
      UniqueId: 00:07:61:B6:6D:9A
      Identifier: bus=0x0005, vendor=0x046d, product=0xb30c, version=0x0040
      KeyLayoutFile: /data/system/devices/keylayout/Vendor_046d_Product_b30c.kl
      KeyCharacterMapFile: /data/system/devices/keychars/Vendor_046d_Product_b30c.kcm
      ConfigurationFile:
      HaveKeyboardLayoutOverlay: false

エラーなどもあるため、作業は、KL、KCMファイルのどちらかだけで行い、動作が確実になったら他方のファイルの編集に入るとよいだろう。今回は最初にKLファイルの編集から行い、その後KCMファイルを作成して編集を行った。

KLファイルの作成とテスト

KLファイルは、Linux Key Code(以下LKC)からAndroid Key Code(同AKC)の変換テーブルだ。KLファイルでの対応は、おもに特殊キーにAKCを割り当てて処理することだろう。今回のdiNovo Miniでは、以下のような割り当て変更を行った。

Windowsロゴキー      ホームキー
レコードキー(赤丸のキー)   バックキー
スタートポーズキー       メディア再生、ポーズ
FN+Vol.Down     メニューキー
FN+Vol.Up       アプリ切り替えキー
FN+Mute     電源キー

また、キーボード右下のメディアセンターボタンは、今回対象としたGalaxy NexusがLKCを発生しないので割り当ては行えなかった。FNキーの組み合わせ部分は、「♪」、「IE」、「電源ボタン」のアイコンが割り当てられており、最初からdiNovoのFNキーでコードが出るようになっている。また、diNovoのメディア再生キーのキートップには、スタートとポーズのアイコンが表示されているものの、MEDIA_PLAYキーコードに変換されており、再生中に押しても停まらなかったため、割り当てを行った。また、利用頻度の高い、ホームキーとバックキーは、利用する場面のない「Windowsロゴキー」と「メディアの録音キー」(赤丸のついたボタン)を利用し、すぐに押せるようにした。

まず、変更するキートップとそれぞれが発生するLKCの関係は(表01)のようになる。これに対して、(表02)のようなAKC名を割り当てることにする。

■表1
キートップ LKC
Windowsロゴキー 125
レコードキー(赤丸のキー) 158
スタートポーズキー 164
FN+Vol.Down 171
FN+Vol.Up 172
FN+Mute 142
■表2
アンドロイド機能名 AKC名
ホームキー HOME
バックキー BACK
メディア再生、ポーズ

MEDIA_PLAY_PAUSE

メニューキー MENU
アプリ切り替えキー

APP_SWITCH

電源キー POWER

具体的なKLファイルは、リスト01のようなものだ。変更したところだけを抜粋すると、

key 125 HOME
key 158 BACK
key 164 MEDIA_PLAY_PAUSE
key 171 MENU
key 172 APP_SWITCH
key 142 POWER

となる。

KLファイルができたら、Bluetoothをオンにしてキーボードを接続する。この時点でKLファイルが読み込まれる。正しく読み込まれたかどうかの1つの判断は、前述のdumpsysコマンドでKey layoutファイルを確認することだ。その後、テストを行ってみればいいだろう。

KCMファイルを作る

次に同じファイル名で拡張子をkcmとしたものを「/data/system/devices/keychars」ディレクトリに作成する。これは、Generic.kcm(/system/usr/keychars)をベースにするといいだろう。

diNovoの場合、特にキーと文字の割り当てに問題はなかったため、ALTキーと英数字の組み合わせにfallbackを使って、特殊キーと同じ働き(たとえば、Alt+Hでホームキーなど)を定義してみた。また、電話など数字のみを入力する場合に、数字キーの7~9の下にあるキー3段分がテンキーになるように「number:」を定義した。これを使えば、電話をかける場合などに、「Y」キーで4が入力でき、「M」キーで0が入力できるようになる。

具体的なKCMファイルは、(リスト02)のようなものになるが、簡単に解説しておこう。まずは、Aのキーでは、Altキーの組み合わせで音楽再生アプリが起動するようにした。

key A {
    label:                              'A'
    base:                               'a'
    shift, capslock:                    'A'
    alt:                                fallback MUSIC
}

「fallback MUSIC」は、AKCである「KEYCODE_MUSIC」を発生させる。なお、利用可能な特殊機能キーには、(表03)のようなものがある。これ以外にも第一回で紹介した資料には、AKCが定義されているのだが、入れるとエラーが発生し、作成したKCMファイルが読み込まれない場合があった。たとえば、「CAMERA」、「CONTECT」、「BOOKMARK」、「FOCUS」などだ。これらをfallbackで指定するとエラーになり、KCMファイル自体が読み込めなくなる。ただ、こうした定義は、機種によって違いがあるため、他の機種では、動作する可能性もある。最初からカメラキーを持っている機種などでは「CAMERA」が動作する可能性はある。

■表3
AKC名 機能
MUSIC 音楽再生アプリ
ENVELOPE メール
CALL 電話
CALCULATOR 電卓
CALENDAR カレンダー
EXPLORER Webブラウザ

さて、3回にわたってAndroidのキーボードのカスタマイズとその実際について解説した。このやり方を使えば、USB、Bluetoothキーボードでキートップと入る文字が違う、特殊キーがアンドロイドでもちゃんと動作するようにしたいといった場合のほとんどに対応できるはずだ。

リスト01

key 1     ESCAPE
key 2     1
key 3     2
key 4     3
key 5     4
      :
    (省略)
      :
key 125   HOME
      :
    (省略)
      :
key 142  POWER
key 158   BACK
      :
    (省略)
      :
key 164   MEDIA_PLAY_PAUSE
      :
    (省略)
      :
key 171   MENU
key 172   APP_SWITCH
      :
    (省略)
      :
key 418   ZOOM_IN
key 419   ZOOM_OUT

リスト02

type FULL

key A {
    label:                              'A'
    base:                               'a'
    shift, capslock:                    'A'
    alt:                                fallback MUSIC
}

key B {
    label:                              'B'
    base:                               'b'
    shift, capslock:                    'B'
    alt:                                fallback ENVELOPE
}

key C {
    label:                              'C'
    base:                               'c'
    shift, capslock:                    'C'
    alt:                                fallback CALL
#    alt:                                '\u00e7'
    shift+alt:                          '\u00c7'
}

key D {
    label:                              'D'
    base:                               'd'
    shift, capslock:                    'D'
#    alt:                                fallback CONTACT
}

key E {
    label:                              'E'
    base:                               'e'
    shift, capslock:                    'E'
#    alt:                                '\u0301'
    alt:                                fallback CALCULATOR
}

key F {
    label:                              'F'
    base:                               'f'
    shift, capslock:                    'F'
    alt:                                fallback CALENDAR
}

key G {
    label:                              'G'
    base:                               'g'
    shift, capslock:                    'G'
    alt:                                fallback EXPLORER
}

key H {
    label:                              'H'
    base:                               'h'
    shift, capslock:                    'H'
    number:             '1'
    alt:                                fallback HOME
}

key I {
    label:                              'I'
    base:                               'i'
    shift, capslock:                    'I'
#    alt:                                '\u0302'
#    alt:                                fallback BOOKMARK
    number:             '6'
}

key J {
    label:                              'J'
    base:                               'j'
    shift, capslock:                    'J'
    number:             '2'
#    alt:                                fallback CAMERA
}

key K {
    label:                              'K'
    base:                               'k'
    shift, capslock:                    'K'
    number:             '3'
#    alt:                                fallback FOCUS
}

key L {
    label:                              'L'
    base:                               'l'
    shift, capslock:                    'L'
}

key M {
    label:                              'M'
    base:                               'm'
    shift, capslock:                    'M'
    alt:                                fallback MENU
    number:             '0'
}

key N {
    label:                              'N'
    base:                               'n'
    shift, capslock:                    'N'
    alt:                                '\u0303'
    number:             '*'
}
      :
    (省略)
      :
key U {
    label:                              'U'
    base:                               'u'
    shift, capslock:                    'U'
    alt:                                '\u0308'
    number:             '5'
}
      :
    (省略)
      :
key Y {
    label:                              'Y'
    base:                               'y'
    shift, capslock:                    'Y'
    number:             '4'
}
      :
    (省略)
      :
key COMMA {
    label:                              ','
    base:                               ','
    shift:                              '<'
    number:             '#'
}
      :
    (省略)
      :
編集部注: 本稿は、2013年2月25日にAndorid情報のWeb専門誌「AndroWire」に掲載した記事を再構成したものです。

26/125

インデックス

連載目次
第125回 大陸でウワサのスマホ、ソフトウェア編
第124回 大陸でウワサのスマホ、デュアルSIM編
第123回 大陸でウワサのスマホを買ってみた
第122回 Androidでコルタナを使う
第121回 Android N、「通知」の表示形式が変更に
第120回 「Android N」の新プレビュー版、Developer Preview 4が登場
第119回 「Android N」プレビュー その3
第118回 「Android N」プレビュー その2、Nの改良点
第117回 「Android N」プレビュー その1
第116回 「ZenWatch 2」の充電動作を調べて見た
第115回 Android Wearのバッテリ関連機能を検証してみる
第114回 Android Wearを再評価してみる
第113回 Nexus 7をカーナビにしてみた(その3)
第112回 Nexus 7をカーナビにしてみた(その2)
第111回 Nexus 7をカーナビにしてみた(その1)
第110回 画面キャプチャに便利なシステムUI調整ツール
第109回 2016年の注目はタブレット
第108回 「Nexus 5X」と「USB Type-C」
第107回 「Nexus 5X」と「LTE」
第106回 Android 6.0 ストアとアプリ
第105回 Nexus 5XでみるAndroid 6.0 Marshmallow
第104回 「Nexus 5X」を買いました
第103回 「Android Mのプレビュー3」を試す(前編)
第102回 Android M プレビュー2 (準備編)
第101回 「LG G Watch」のその後
第100回 「Zenefone 2」買いました
第99回 ちいさくてかわいい「LG L20」、イギリスで買ってみました
第98回 「Google日本語入力」アップデートで何が変わった?
第97回 どのアプリで開く? 「インテント」の仕組み
第96回 「OneNote」をつかってみた
第95回 ロリポップのマテリアルデザインをまとめてみる
第94回 「Email Markup」って何?
第93回 Outlookは来たけれど
第92回 Office Previewつかってみた
第91回 Google INBOXを使ってみる
第90回 AndroidWareの文字盤を自作する
第89回 Android Ware Lollipop版
第88回 「Nexus Player」を試す - ソフトウェア編
第87回 「Nexus Player」を試す - ハードウェア編
第86回 「Nexus 9」ファーストインプレッション - ソフトウェア(Lollipop)編
第85回 「Nexus 9」ファーストインプレッション - ハードウェア編
第84回 充電しながらUSBデバイスが使えるホストケーブル
第83回 Android "L"プレビューとAndroidWareがアップデート
第82回 ちょっとイケてる「Kyocera Hydro Vibe」
第81回 Android "L" バッテリ消費を監視する
第80回 アクセスポイントの基本を知る
第79回 OneDriveとGoogleドライブ
第78回 シェルのネットワーク関連コマンド
第77回 "L"の中身
第76回 アンドロイドウェア(Android Wear)は暫定バージョン?
第75回 LGのスマートウォッチ「G Watch」
第74回 "L"がくる
第73回 次は「Lollipop」か? その前にKitKatが4.4.3に
第72回 VPNを使う その3 「VPNをアンドロイドから使う」
第71回 「Chromecast」とは?
第70回 VPNを使う その2 「VPNサーバーを立てる」
第69回 VPNを使う その1 「基礎編」
第68回 アンドロイドのストレージ
第67回 「NVIDA SHIELD」のソフトウェア
第66回 「NVIDA SHIELD」のハードウェア
第65回 HDMIとMHL、SlimPort - ディスプレイ接続端子を整理してみる
第64回 「LG L1 II」を買ってみた
第63回 アンドロイドに音楽を「聞かせる」
第62回 住所録の秘密
第61回 Outlook.comをカレンダーに表示する
第60回 ソースコードはどこにある?
第59回 AndroidのBluetoothテザリングとWindows 8.1
第58回 NFCでマニュアル参照を簡単に
第57回 あらためて「ポータブルアクセスポイント」をきちんと試してみる
第56回 「ビルド番号」ってなに?
第55回 画面キャプチャをバッチファイルで実行
第54回 adbコマンドをちょっと解説
第53回 「android 4.4 "Kit Kat"」で画面を録画する
第52回 「android 4.4 "Kit Kat"」の内部的な変更点
第51回 「android 4.4 "Kit Kat"」を解説
第50回 「Nexus 5」を買ってみた
第49回 Google Keepはリマインダーだった
第48回 android 4.2からサポートされた「ワイヤレスディスプレイ」
第47回 画面キャプチャー
第46回 ヘッドセットの秘密
第45回 Nexus 7のLTEモデル
第44回 Nexus 4買いました。アメリカで。
第43回 ブートローダーとfastboot
第42回 Jelly Beans 4.3 Returns
第41回 Chromecast、テレビに刺さる
第40回 デバイスマネージャでAndroidの位置を確認
第39回 新しいNexus 7を買ってみた
第38回 Jelly Beans 4.3
第37回 レノボ「K900」を国際版化
第36回 NFCで遊ぶ
第35回 自宅で簡単ファイル転送
第34回 レノボ「K900」のカスタマイズされたJelly Beansを見てみる
第33回 CloverTrail+のスマートフォン、レノボ「K900」を買ってみた
第32回 AndroidがBluetooth 4.0を正式サポート
第31回 ARMの次世代CPU「Cortex-A12」
第30回 SDKをインストールしよう
第29回 ウィジェットを活用
第28回 QRコードでお手軽設定
第27回 XPERIA Tipoとロンドンアンロック屋事情
第26回 diNovoキーボードを使う
第25回 キーボードをカスタマイズする
第24回 Androidキーボードのしくみ
第23回 2段階認証を使おう
第22回 いらないプリインストールアプリを削除
第21回 64bitなんて必要なのかしら?
第20回 アメリカでアンドロイドの読書端末を買ってみた
第19回 Android 4.2の新機能
第18回 Android Beamって何だ?
第17回 NFCで何ができる?
第16回 Nexus 7をアメリカで買ってみた
第15回 AndroidをPCにつなぐと
第14回 Androidの記憶領域
第13回 Google Nowを使ってみる
第12回 AndroidのUSBホスト機能
第11回 デュアルSIMを使ってみる
第10回 キーボード一体縦型Androidマシン
第9回 Androidの言語設定
第8回 アンドロイドに道を聞く
第7回 Google Playはどうやってアプリの公開を制御しているのか?
第6回 「Acer A100」がICSになった
第5回 つながっているのはACアダプタ、それともUSB端子
第4回 スマートフォンを普通の電話としてつかってみた
第3回 Androidからの通知を表示可能な腕時計
第2回 アームを誤解してませんか?
第1回 MWCで見たAndroid

もっと見る

人気記事

一覧

新着記事