オープンソース版Google日本語入力をビルドしてみよう

2013年3月29日 by · コメント(26)
カテゴリ: Android, 開発のこと 

image

キタコレ!!!!

Google 日本語入力 Android 版がオープンソースになりました。 – Google Japan Developer Relations Blog

以下の情報は 2013/3/29 現在の情報です。

なにはともあれ ubuntu です。今回は 12.10 64bit 版でやってみよう。

http://www.ubuntu.com/download

インストール先は Virtual Box だろうが実機だろうが好きにしてください。

インストールしたらとりあえずソフトウェアの更新!

続いてインストラクション通りに…

AndroidBuildInstructions -  mozc – How to build Mozc for Android – Mozc – Japanese Input Method for Chromium OS, Android, Windows, Mac and Linux – Google Project Hosting

やってみよー ※手順通りだと途中でエラーが出るので都度なんとかします。

注意点は NDK 8c 以降ってことですかね。うっかりすると 8b だったりするのでアップデートしておきましょう。

 

ほい、まずエラーはここから。

python build_mozc.py gyp --target_platform=Android

するとエラーが出ます。

image

え?! Android SDK 必要なんて聞いてないっ!!

もっと読む

リフレクションで非公開のAPIを使ってみた

2013年3月17日 by · コメント(1)
カテゴリ: Android, 開発のこと 

image

なんとなく smali 見てたら面白そうな API があったけど呼び出し方がわからない!

ってことで色々調べてたらてくぶさん。

リフレクションをつかってメソッドを呼び出す – Tech Booster

なるほどリフレクション。こういうのもあるのか。

以下の感じで使うらしい。※一部伏字

ポイントは smali から発見した面白そうなクラス名を Class.forName で指定すること。

smali の1行目にあるこんなのを

.class public Lcom/moto????/internal/telephony/SbmNamHandler;
"com.moto????.internal.telephony.SbmNamHandler"

にして使う。

次のポイントは getMethod でメソッド名と引数を指定すること。引数は型を間違うとそんなメソッド無いって怒られる。じゅうよう!

smali の該当部分はこれ

.method public static getSbmNamID(ZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;

メソッド名は「getSbmNamID」ってのはわかる。引数は Z = boolean.class で Ljava/lang/String = String.class なのでこうなる

Method m = c.getMethod("getSbmNamID", boolean.class, String.class, String.class, String.class);

呼び出しは invoke です。今回は元が static なので第1引数は null らしいです。ということで、まとめるとこんな感じになります。

TelephonyManager tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);

try {
    Class<?> c = Class
            .forName("com.moto????.internal.telephony.SbmNamHandler");
    try {
        Method m = c.getMethod("getSbmNamID", boolean.class,
                String.class, String.class, String.class);
        Object ret = m.invoke(null, true, tm.getLine1Number(),
                tm.getDeviceId(), tm.getSubscriberId());
        sbmid = ret.toString();
        Log.d("sbmcgm", "ID:" + sbmid);
    } catch (Exception e) {
        e.printStackTrace();
    }
} catch (ClassNotFoundException e) {
    e.printStackTrace();
}

こんな感じにすると RAZR M 201M で forgsmartphone の ID とか Pass がわかるようになります。これで SIM ロックされてない Band I 対応端末でも通信できますが、いくら 4G が全盛期の1%の速度も出なくなったからとはいえ正直 Band I だけだとドコモのほうがマシなんじゃねーの?

非公式 API で色々できそうなのは楽しそうな気がしました。めでたしめでたし。