tetsu31415.log

androidなどのことを書き綴っていこうと思います。

Android4.4でGoogle日本語入力の辞書をインポートする方法

はじめに

AndroidIMEGoogle日本語入力」がAndroid4.4(KitKat)で辞書インポートができないという話を聞いたので少し調べてみました。

※長々と説明していますが時間がない方はベージの最後の方にあるアプリを使えばAndroid4.4でも辞書インポートが楽にできるのでぜひお使いください。

環境

検証

外部ストレージ直下に辞書ファイルを配置します。
※ わかりづらいですがここでいう外部ストレージはSDカードとは限りません。
最近の端末では内部ストレージ内にあることが多いです。
大抵の場合 /sdcard でアクセスできると思います(適当)

ESファイルエクスプローラで辞書データを開きます。
f:id:tetsu31415:20140719224333p:plain
するとこのように「ファイルを読み込めません。」とトーストが表示されます。

確かに辞書のインポートができません。

原因

この原因はKitKatで外部ストレージの仕様が変更されたことにあります。
以前は外部ストレージの読み込みには権限が不要でしたが、
KitKatで「READ_EXTERNAL_STORAGE」というパーミッションが正式対応され、
この権限がないと外部ストレージのデータを読み込むことはできなくました。
その代わりに外部ストレージの一部領域が権限なしで読み書きできるようになりました。

外部ストレージの仕様の変化は以下のとおりです。

  • Android4.3(Jelly Bean)まで

読み込みには権限が不要
書き込みには「WRITE_EXTERNAL_STORAGE」が必要

読み込みには「READ_EXTERNAL_STORAGE」が必要
書き込みには「WRITE_EXTERNAL_STORAGE」が必要
ただし外部ストレージの以下の領域は権限なしで読み書きが可能

[外部ストレージ]/Android/data/[パッケージ名]/ 

※「WRITE_EXTERNAL_STORAGE」は「READ_EXTERNAL_STORAGE」を内包しているので読み込みも可能です。

ここでGoogle日本語入力の権限を見てみます。
f:id:tetsu31415:20140719231842p:plain
Google日本語入力の権限には「READ_EXTERNAL_STORAGE」や「WRITE_EXTERNAL_STORAGE」は含まれていません。
よってAndroid4.4のGoogle日本語入力では外部ストレージの読み込みはできません。

解決策

先ほど説明した外部ストレージにあるアプリが権限なしで読み書き可能な領域にインポートしたい辞書データを置くとアプリがデータを読み込むことができます。

実際に試してみます。
以下の場所に辞書データを置きます。(zipでも可)

[外部ストレージ]/Android/data/com.google.android.inputmethod.japanese/[辞書データ].txt

そのファイルをESファイルエクスプローラーから辞書データを開きます。
f:id:tetsu31415:20140719232804p:plain
すると、ファイルが読み込まれ、インポート先の辞書を選択するダイアログが表示され…
f:id:tetsu31415:20140719232954p:plain
辞書データが読み込まれました!!
(内容は適当です)

これでKitKatでもGoogle日本語入力の辞書インポートができました。

ツール化

ここで終わっても良かったのですが辞書をインポートするたびここにデータを置くのは面倒だなと思ったのでアプリ化してみました。
このツールでは選択されたデータを先ほど説明したGoogle日本語入力が読み書きできる領域にコピーしそれを開くということをやっています。

いずれGoogle日本語入力のほうでこの問題は解決されると思うので野良アプリにしました。
しばらく改善されない感じなので結局Playストアにアップロードしました。
ご自由にお使いください。

DicImportTool.apk
(ICS以降の端末に対応しています)

使い方は「ファイルを選択」からファイルを選択し、「辞書データを読み込み」を押すだけです。
f:id:tetsu31415:20140719235101p:plain

適当に作ったのでバグが有る可能性が高いです。
何かあれば@tetsu31415までお願いします。

サービスモードログ収集アプリを作った

Galaxyには主に電波状況などを見ることができるServiceModeが搭載されています。(ダイアルパッドから*#0011#などで開くことができます)
ServiceModeアプリ起動中にはlogcatにServiceModeアプリに表示される情報が吐かれているのでこれを前回の記事の方法で記録するアプリを作りました。
同時に、記録された場所の位置情報、基地局情報も記録されるようになっています。
このアプリで記録された情報を外部へ送信するようなコードは一切含まれておりません。
記録されたデータをSDカードに出力する機能が付いているので煮るなり焼くなりしてください。

このアプリは一般の人向けではありません。
このアプリを使うときには再起動毎にPC接続が必要です。
このアプリはGALAXY専用です。
記録される内容の正確さの責任は負いかねます。
(別のアプリがServiceModeと同じ形式のlogcatを吐いた場合でも記録されます)
ご利用は自己責任でお願いします。

  • apk

SM-Logger.apk

  • 使い方

このアプリをインストールする前にPlayストアからTerminal Emulatorをインストールします。
※先に本アプリを入れてしまった場合はTerminal Emulatorをインストール後、本アプリを再インストールする必要があります。

まず、logを収集できるようにするためにShell権限を取得します。(この作業は再起動毎に必要です)
アプリを起動してShell権限の取得を押します。
そしてusbでadb接続し、

adb tcpip 5555

と入力してTCPモードに切り替えます。
そして「Shell権限を取得」を押します。
画面の下に"Success!"と表示されれば成功です。
されない場合は下の「adb serverを再起動」を押してください。
するとTerminal Emulatorが起動し、処理が行われます。
※初回時はデバイスの許可のダイアログがでるので許可してください。
その後もう一度「Shell権限を取得」を押してください。

Shell権限が取得できたらトップ画面の「ログ収集を開始」を押してログ収集を開始します。
停止する場合は「ログ収集を停止」を押してください。

ログ収集サービス起動中にServiceModeを開いた時にログを収集します。

ログが収集されたらログを見てみます。
トップ画面から「ログを見る」を押し、開始時刻と終了時刻を設定し、表示項目を選択して下にある「ログを見る」を押すとログの検索が始まります。


検索条件の欄には条件を書くことができます。
いくつか例をあげます。
※これは一例です。機種によって項目が変わる可能性があります。

Band18のもののみを表示

"LTE Band:18"

Band1でかつバンド幅が20MHzのものを表示

"LTE Band:1" AND "LTE DL BW:20MHz"

Band1またBand18のものを表示

"LTE Band:1" OR "LTE Band:18"

Band18のものを除いて表示

NOT "LTE Band:18"


トップ画面のバックアップボタンを押すとログのデータベースを出力できるようになっています。
/sdcard/sm_log.db に出力されるようになっています。


最後まで読んでいただきありがとうございました。
ご利用は自己責任でお願いします。

不具合等は@tetsu31415までお願いします。