KINDLE Fire HD 10 PlusとFintie 取り外し可能なBluetooth キーボード付きカバーの「-」と「^」を交換

この間のプライムーでのときに、KINDLE Fire HD 10 PlusFintie 取り外し可能なBluetooth キーボード付きカバーを購入しました。

【NEWモデル】Fire HD 10 Plus タブレット10.1インチHDディスプレイ 64GB スレート
【NEWモデル】Fire HD 10 Plus タブレット10.1インチHDディスプレイ 64GB スレート新登場【Fire HD 10, Fire HD 10 Plus 2021年発売 第11世代用】Fintie 取り外し可能なBluetooth キーボード付きカバー (Made for Amazon認定取得)
新登場【Fire HD 10, Fire HD 10 Plus 2021年発売 第11世代用】Fintie 取り外し可能なBluetooth キーボード付きカバー (Made for Amazon認定取得)

サッカーの試合観るときに、W-Zero3って端末使って見てる試合の記事作ってたのですが、PHSも停波になったし、SDカードスロットも不調だしで、替わりに使えないかなぁと思って。(こちらのページを参考にしてUSB経由でデータのやりとり自体はできてはいましたが)

で、実際に使ってみてですが、無意識のブラインドタッチで入力すると「-」のところが「^」になってて、「シュート」と入力したつもりが「しゅ^と」となったりで、キーの入れ替えできないかなぁと思って試してみました。

はじめは、KCMファイルの「-」と「^」のキーの中身書き換えればいいのかなぁと思ったのですが、こちらはうまくいきませんでした。これは今一わからず。結論から言うと、typeをOVERLAYにしてKEYを書き換えるというKCMファイルを使用したらうまく行きました。あくまでベースに製品のKCMファイルがあって、それを上書くみたいな思想なんでしょうか。
ROOT化すれば、直接該当のKCMファイルの書き換えで行けたのかもしれませんが。

色々入れては見たのですが、最終的に必要だったのは、
・KINDLE Fire HD 10 Plus
・Fintie 取り外し可能なBluetooth キーボード付きカバー
Android Studio
・Android StudioをインストールしたPC

以下のサイトとそのリンク先を参考にしました。
Gemini PDAのキーボードをカスタマイズする(root権限不要)
Android の外付けキーボードのレイアウトを変更する
Android 設定備忘録 HID外付けキーボードを使う
Android:storage/emulated/0/のファイルをPCで取得する
Amazon Fire HD 8 PLUS 2020 開発者オプションを有効ににする手順
よく使うadbのコマンド

大まかに流れを説明すると、実機で利用してるキーボードの情報を調べて、キー入れ替え用のKCMファイルを作成、それを取り込んだアプリを作成して、実機で実行みたいな感じ。

1.キーボードの情報
 キーボードをタブレットに接続した状態で、PCとタブレットを接続します。(開発者オプションは有効にしておいてデバッグもできるようにしとく)
 PCとの接続が成功している状態で、adbコマンドを実行します。
 PC側で動くプログラムで、クライアントからキックして、サーバを立ち上げて接続するそうです。
 adbはAndroid Studioをインストールしたパスの「SDK\platform-tools」の下に普通は入っているようです。

02.png

 「adb start-server」を実行したとき、タブレット側で下の画面が出るので、「OK」を選択する。多分OKしないとPCとタブレットが繋がらない。

01.jpg

 開いたシェルから「dumpsys input」を実行する。実行結果が長いので見づらいときは、リダイレクトでファイルに出力するといいのかも。
 タブレットのPCから見た内部ストレージのパスは、「/storage/emulated/0/」になるようです。

03.png

タブレットで使用しているのは、「Fintie Keyboard」になります。私が使用しているのは、
VendorID=0171、ProductID=0422、Version=0004
のものということのようです。
その下の行に出てますが、上記のID、VersionのKLファイルとKCMファイルを利用しているということのようです。
ROOT権限があれば、KCMファイルを書き換えればよいようですが、今回は「Android 4.1 以降で使用可能な User-installable keymaps」というので書き換えを行います。

キーキャラクターマップファイル「/system/usr/keychars/Vendor_0171_Product_0422_Version_0004.kcm」を見ると、

04.png

「MINUS」が「-」キー、「EQUALS」が「^」キーになっています。「\u005E」が「^」、「\u007E」がShiftと押したときの「~」です。
てっきり、ここの「MINUS」と「EQUALS」の中身をそっくり入れ替えたKCMファイルを作ればよいかと思ったのですが、それではうまく行きませんでした。

で、キーレイアウトファイル「/system/usr/keylayout/Vendor_0171_Product_0422_Version_0004.kl」を見ると、

05.png

「MINUS」は「key 12」で、「EQUALS」が「key 13」なので、それぞれを入れ替えるように上書きするということになります。(KCMファイルで)

私は、以下の「chg_hat.kcm」を作成しました。「type OVERLAY」というのがキモなんでしょうか?ここら辺(「Vendor_0171_Product_0422_Version_0004.kcm」をコピーして、「MINUS」と「EQUALS」の中身を入れ替えたKCMファイルを作ればいいのかと思っていた)がよくわかりませんでした。

06.png

type OVERLAY

# CAPS_LOCK
map key 12 EQUALS
map key 13 MINUS


2.アプリの作成
 Android 4.1 以降ではROOT権限なくてもUser-installable keymaps機能を使えばKCMファイルの追加?ができるとのことなので、その機能をもったアプリを作成します。
 適当にAndroid 4.1 以降の新規プロジェクトで「Hello World!!」だけ表示するアプリを作成して、それに追加してく形です。

 ○「AndroidManifest.xml」の編集
  「receiver」タグの部分を追加。エラーになる部分は赤く強調されるのでそれぞれ対応してきます。

07.png

   ・「.InputDeviceReceiver」の部分はマウスオーバすると自動生成で「InputDeviceReceiver.java」を作成できます。実メソッド必要なのかエラーになるので、「onRecive()」メソッドとそれに伴うimport文を追加。
08.png

   ・「"@string/keyboard_layouts_label"」の部分はマウスオーバすると「app\src\main\res\values\strings.xml」に値を設定できます。
    タブレットからキーボードのレイアウト選択するときの選択名ですね。画像の赤枠の部分。
09.png

   ・「"@xml/keyboard_layouts"」は手動で「app\src\main\res」に「xml」フォルダ作って「keyboard_layouts.xml」格納しました。自動生成だとプレーンなテキストの生成の仕方がよくわからなかったので。

  ○「keyboard_layouts.xml」の追加
   というわけで、こいつはファイル自分で作って追加です。
10.png
   ・「"@string/keyboard_layout_japanese_label"」の部分はマウスオーバすると「app\src\main\res\values\strings.xml」に値を設定できます。
    2つ上の画像で青の枠で説明した部分のテキストになります。

   ・「"@raw/chg_hat"」の部分は、今回追加するKCMファイルの指定になります。「app\src\main\res」に「raw」フォルダを作って、上で作成した「chg_hat.kcm」を投入しました。

とりあえず、これでビルドが通るはずです。
少しハマったのが、リソースの下に入れるファイルの名称に規則あるみたいで、アルファベット小文字使う必要あるのかな?
あと、リソースのファイルの先頭に余計な空行とか空白入ってるとエラーで弾かれるようです。

ビルドが通ったら実機で実行すれば、キーボードのレイアウトの選択で追加した設定が選択できるようになります。

おおまかな手順は、
Android の外付けキーボードのレイアウトを変更する
のサイトを参考にしました。

この記事へのコメント

この記事へのトラックバック