Home > Technology

nunnun's weblog

SIMフリーなiPhone4Sで緊急地震速報を受信する

SIMロック解除されたiPhone 4SでドコモのSIMを使って運用できることは既知で、SoftBankやKDDIと同様にCarrier BundleをインストールすればCMAS(緊急地震速報)を受信することは論理的に可能だったのだけど、実際に設定して動作を確認した訳じゃなかった。

ドコモやソフトバンクの緊急地震速報は3GPPのCBS(Cell Broadcast SMS)という仕組みを使っていて、その中のMessageIdと呼ばれる情報要素が緊急地震速報である場合にアラートを出すという仕組みでした。[1]

ただ、どのMessageIdが緊急地震速報(というかエリアメール)に相当するかの情報は開示されていなかったので、どのメッセージを表示したらいいかわかりませんでした。

ちょうどドコモのエリアメール対応Androidを弄っていたところ、エリアメールに相当するMessageIdがわかったので、設定してみた。

具体的にはMessageIdが40960から41983なメッセージをドコモはエリアメールと扱っているみたい。
そこでSoftbank_jp.bundleを参考に改変してみました。こんな感じ。

<dict>
	<key>MessageIDParameters3GPP</key>
	<dict>
		<key>OptOut</key>
		<array>
			<dict>
				<key>ToServiceID</key>
				<integer>41983</integer>
				<key>FromServiceID</key>
				<integer>40690</integer>
				<key>Selected</key>
				<true/>
			</dict>
			<dict>
				<key>ToServiceID</key>
				<integer>43009</integer>
				<key>FromServiceID</key>
				<integer>43008</integer>
				<key>Selected</key>
				<true/>
			</dict>
		</array>
	</dict>
</dict>

ちなみに43008-43009はSoftBankのCarrier Bundleにもともと入ってたもの。

で、今朝の東京都の帰宅困難者訓練でエリアメールの配信を行う[2]とのことだったので、待機してたところ無事受信できた。

  1. 緊急情報の同報配信サービスの開発 - http://www.ntt.co.jp/journal/0806/files/jn200806036.pdf
  2. 東京都防災ホームページ:東京都の対策 - 帰宅困難者対策訓練 - http://www.bousai.metro.tokyo.jp/japanese/tmg/0203kitaku.html

Googleの2-step verificationが日本に対応した

Googleの2-step verificationでバックアップオプションとしてようやく日本の電話番号が使えるようになった。

2-step verificationではパスワードの他にワンタイムパスワードを入力するのだけど、そのワンタイムパスワードを受け取る手段としてGoogle AuthenticatorやSMSが存在した。普段はGoogle Authenticatorで十分なのだが、Google Authenticatorはインストールしているスマートフォンをうっかり初期化とかしてしまった際に、ワンタイムパスワードを生成できなくなって困ってしまうことが何度かあった。

そういったことを防止するために、SMSによるBackupが存在しているのだが、今までは日本の番号は対応していなかった。
それが、ようやく対応したみたい。

Google 2-setp verification supports Japanese number!

ただ、現状Google Calendarなどと同じようにキャリアメールしか対応してない。
スマホが普及して、かつSMSの相互運用がスタートしたので、そろそろSMSでも送ってくれてもいいのではないかと思う。
(ただキャリアメールでなく、電話でコードを受け取ることもできるので運用上は問題はなさそう)

非Deodex環境 [SO-02C] でセルスタンバイ問題を解決する

AndroidでMVNOなデータSIMを使うと電界強度(アンテナピクト)が表示されなかったり、セルスタンバイで圏外時間が100%になってしまって電池の消費が激しくなるという問題があったのだけど、それを解決する方法をブローヴちゃん: Android + b-mobile データ専用 SIM で電界強度を表示するで発見したので、試してみました。

上記のページだとdeodexされた環境で逆アセンブルして変更という手法がとられていたけど、手元にあるXperia Acroは非deodex環境だったので、deodex化せずに変更したみたので書いてみた。

注意: rooted環境じゃないとそもそもこのHackは適用できません。いつものことですが、失敗したら確実に文鎮化します。

用意するもの

手順

  1. 実機から/system/frameworkを抜いてきます。
    $ adb pull /system/framework framework
  2. framework.odexframework.jarを作業ディレクトリにコピーします
    $ mkdir workspace
    $ cp framework/framework.odex workspace/
    $ cp framework/framework.jar workspace/
  3. framework.odexを逆アセンブルします
    $ baksmali --api-level 10 -d ../framework -c:core-junit.odex -x framework.odex
    -c:オプションには逆アセンブルに必要なクラスを適宜追加します。Xperia acro(SO-02C)ではオプションを指定しなかった場合、
    $ baksmali --api-level 10 -d ../framework -x framework.odex 
    Error occured while loading boot class path files. Aborting.
    org.jf.dexlib.Code.Analysis.ClassPath$ClassNotFoundException: Could not find superclass Ljunit/framework/TestCase;
    	at org.jf.dexlib.Code.Analysis.ClassPath$ClassDef.loadSuperclass(ClassPath.java:830)
    	at org.jf.dexlib.Code.Analysis.ClassPath$ClassDef.(ClassPath.java:683)
    	at org.jf.dexlib.Code.Analysis.ClassPath.loadClassDef(ClassPath.java:280)
    	at org.jf.dexlib.Code.Analysis.ClassPath.initClassPath(ClassPath.java:163)
    	at org.jf.dexlib.Code.Analysis.ClassPath.InitializeClassPathFromOdex(ClassPath.java:110)
    	at org.jf.baksmali.baksmali.disassembleDexFile(baksmali.java:104)
    	at org.jf.baksmali.main.main(main.java:293)
    Error while loading class Landroid/test/AndroidTestCase; from file framework.odex
    Error while loading ClassPath class Landroid/test/AndroidTestCase;
    こんな感じのエラーが出ました。(この場合AndroidTestCaseが足りないのでcore-junit.odexを追加します。)
  4. アンテナピクトの扱いを変更する
    逆コンパイルしたクラスファイルを編集します。基本的にはブローヴちゃんさんの手順通りですが、展開したoutフォルダにあるcom/android/internal/telephony/gsm/GsmServiceStateTracker.smaliを編集します。
    Xperia Acroでは以下のように変更するとうまくいきました。
    :pswitch_data_22
    .packed-switch 0x0
        :pswitch_20
        :pswitch_1f
        :pswitch_1f
        :pswitch_1f
        :pswitch_20
        :pswitch_1f
        :pswitch_5
        :pswitch_5
        :pswitch_5
        :pswitch_5
        :pswitch_20
        :pswitch_5
        :pswitch_1f
        :pswitch_1f
        :pswitch_20
    .end packed-switch

    ちなみに変更後と変更前でパッチを作りました。
    http://nunnun.jp/src/so-02c/GsmServiceStateTracker.smali.patch
    パッチとGsmServiceStateTracker.smaliを同一ディレクトリにおいた状態で、

    $ patch GsmServiceStateTracker.smali < GsmServiceStateTracker.smali.patch
    で適用できます。
  5. 編集したframework.odexをアセンブルします
    先ほど逆アセンブルを実行した作業ディレクトリに戻って、smaliを実行します。
    $ smali -o classes.dex out
    うまくいくとclasses.dexが作成されているはずです
  6. framework.jarを展開します
    jarファイルはzipファイルなので展開します
    $ unzip framework.jar -d framework_jar
    Archive:  framework.jar
       creating: framework_jar/META-INF/
      inflating: framework_jar/META-INF/MANIFEST.MF  
      inflating: framework_jar/preloaded-classes
  7. classes.dexを追加します
    先ほどframework.jarを展開したディレクトリにコピーします。
    $ cp classes.dex framework_jar/
    $ ls -l framework_jar/
    total 14336
    drwxr-xr-x  3 hiro  staff      102 10 10 01:44 META-INF
    -rw-r--r--  1 hiro  staff  7269368  1 12 21:40 classes.dex
    -rw-r--r--@ 1 hiro  staff    65580 10 10 01:19 preloaded-classes
  8. framework.jarを再度生成します
    先ほどの逆でzipで固めます。
    $ zip ../framework.jar.new META-INF preloaded-classes classes.dex 
      adding: META-INF/ (stored 0%)
      adding: preloaded-classes (deflated 82%)
      adding: classes.dex (deflated 56%)
    これでPC側での作業はおわり。
  9. 実機に必要なファイルをコピーします
    どこでもいいのですが、/data/local/tmpとかに新しく生成したframework.jar.newとダウンロードしたdexopt-wrapperを転送して、dexopt-wrapperを実行可能にします。
    $ adb push framework.jar.new /data/local/tmp/framework.jar.new
    2047 KB/s (3185980 bytes in 1.519s)
    $ adb push dexopt-wrapper /data/local/tmp/
    609 KB/s (5512 bytes in 0.008s)
    $ adb shell chmod 755 /data/local/tmp/dexopt-wrapper
  10. dexopt-wrapperを使ってjarをodexに変換する
    $ adb shell
    $ cd /data/local/tmp
    $ ls
    dexopt-wrapper
    framework.jar.new
    $ ./dexopt-wrapper framework.jar.new framework.odex
    --- BEGIN 'framework.jar.new' (bootstrap=0) ---
    --- waiting for verify+opt, pid=7612
    --- would reduce privs here
    --- END 'framework.jar.new' (success) ---
    $
  11. 署名をコピーする
    このままだと動かないのでオリジナルのframework.odexから署名部分だけコピーしてきます。
    $ adb shell
    $ cd /data/local/tmp
    $ busybox dd if=/system/framework/framework.odex of=framework.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
    20+0 records in
    20+0 records out
    20 bytes (20B) copied, 0.004334 seconds, 4.5KB/s
    $ ls -l
    -rw-r--r-- shell    shell     7384328 2012-01-12 21:53 framework.odex
    -rwxr-xr-x shell    shell        5512 2009-05-30 23:15 dexopt-wrapper
    -rw-rw-rw- shell    shell     3185980 2012-01-12 21:42 framework.jar.new
    注意 必ずbusyboxddを使ってください。間違えると、conv option disabledというエラーが返ります。
  12. framework.odexを置き換える
    これはrecoveryとかで実施した方が安全です。
    /systemをrwで再マウントして、
    # cp /data/local/tmp/framework.odex /system/framework/framework.odex.new
    # mv /system/framework/framework.odex /system/framework/framework.odex.bak
    # mv /system/framework/framework.odex.new /system/framework/framework.odex
    # sync
    とかします。

やると意外と面倒でした。
いちおう元のframework.odexとパッチを当てて署名したframework.odexの差分を取ったパッチを作りました。

  • framework.odex.patch
    元のframework.odex MD5 (framework.odex) = 7b474a8d99ab92d4286d422cd6e1d511
    パッチ適用後: MD5 (framework_new.odex) = e3ea45b180e9e71bf39d665e4ca8b1ac
    こんな感じで適用できるはずです。
    $ bspatch framework.odex.bak framework.odex.new framework.odex.patch

間違っているところとかあったら指摘よろしくお願いします。

Kindle Fireでの日本語入力 [続] / Japanese Input on Kindle Fire

前回settings.dbを弄ることで日本語入力を可能にする方法を書いたが、実はもっと簡単な方法があったので備忘録的に書きたいのと、英語で教えて欲しいとリクエストがあったので、英語でも簡単にまとめてみます。

Here is the instructions that enables Japanese input method on Amazon Kindle Fire.

準備 / Before hack

rootを取ります。rootの取り方はいくらでもググれば出てくるので割愛します。過去の記事を参考にしていただいてもかまいませんが、情報が古い可能性は十分にあります。

Make sure you can access your kindle as root privileges, if not you can find a way to get root access to your kindle fire. After getting root privileges, install Android Market App into your kindle fire. You can also find a way to install Android Market on the internet.

IMEのインストール / Installing Japanese Input Method

Android Marketで好きなIMEをインストールします。ATOKなりGoogle日本語入力なりSimejiなりインストールしてください。

Install Japanese Input Method from Android Market. For example, you can install ATOK, Google Japanese Input (Google日本語入力) and Simeji. ATOK is a paid application but others are free.

IMEを有効化する / Enabling IME

ここまでは前回と同じです。前回はここでsettings.dbを弄りましたがハードルが高いので、"ime"というコマンドをadb shellでたたくことで同じことが可能ですので試してみます。

Let's enable Japanese Input Method on your kindle fire. As previrous artcle, I introduced a way to enable Japanese input method by changing settings.db however that way is bit difficult so that this time we're using another method using "ime" command on adb shell.

hiro$ adb shell
$ su
# ime list -s
com.android.inputmethod.latin/.LatinIME
com.justsystems.atokmobile.service/.AtokInputMethodService

adb shellにてKindle Fireにアクセスした後、suコマンドにてroot権限に昇格します。昇格後、ime listと打つとインストールされているIMEが一覧になって出力されます。

その後 ime enable と ime set を利用してIMEを有効化します。

After logged in your kindle fire using adb shell from your console, type "su" to access as root. Then you could see installed IME(Input Method Editor) using "ime list" command.

Finally you can enable and select IME using "ime enable" and "ime set" command.

# ime enable com.justsystems.atokmobile.service/.AtokInputMethodService
Input method com.justsystems.atokmobile.service/.AtokInputMethodService: already enabled
# ime set com.justsystems.atokmobile.service/.AtokInputMethodService
Input method com.justsystems.atokmobile.service/.AtokInputMethodService selected

何か不足している点などありましたら、指摘していただけると助かります。

Amazon Kindle Fireで日本語を入力する / ATOK,simejiをインストールする

[2012年1月7日追記: より簡単な方法と英語でのやり方をアップしました。/ You can find english instructions ]

Kindle Fireが届きました!

199ドルにしては非常に出来が良いです。液晶もきれいだし、思っていたよりも軽いし、裏がゴムっぽくて持ちやすくていいです。

Kindle FireはAndroidベースの端末ですでにrootをとる方法も確立されているので、Hackして遊ぶにも最適です。(というか僕はHack目的で買いました笑)標準で日本語フォントも中華フォントだけど入ってるのでとりあえず困らずに使えます。 ただ、日本語入力ができるか心配でしたが、ATOKをインストール・そして日本語入力をさせることができたので、忘れないようにメモしておきます。

私は以下の手順で可能にできましたが、あくまで自己責任でお願いします。これによりKindle fireの保証はなくなりますし、これによってKindle Fireが故障した場合でも私は一切の責任を負いかねます。あらかじめご理解ください。

Enabled Japanese Input Method on Kindle Fire

rootを取る

すでに英語でやる方法はいろんなところに出回っているので、別に必要ないのですが、簡単に日本語でもまとめておきます。(adbの使い方とか他のAndroid端末でも共通していることはgoogleで検索してください)

準備

僕がやったときはWindowsでrootを取る方法しかなかったので(というかそれを最初に見つけてしまったのでWindowsでやった)とりあえずWindowsが動く環境を用意します。x64でもx86でも動くと思います。

WindowsマシンにAndroid SDKをセットアップします。そのときにかならずGoogle Driverをインストールしてください。インストールしたら、Driverのinfをいじります。android_winusb.inf を開いて、Kindle FireのIDを追加します。ファイルの中に[Google.NTx86][Google.NTamd64]のセクションがあると思うので、その先頭に以下の行を追加して保存します。

;Kindle Fire
%SingleAdbInterface% = USB_Install, USB\VID_1949&PID_0006
%CompositeAdbInterface% = USB_Install, USB\VID_1949&PID_0006&MI_01

また、adbにKindle fireがAndroidデバイスであることを認識させるために、ホームディレクトリ直下の.androidフォルダのadb_usb.iniに以下の行を追加します。(ファイルが無かったら追加してください)

0x1949

これで準備は完了

rootを取ろう

rootはSuperOneClickを使って一瞬でとれます。
[APP]SuperOneClick v2.2 (now with zergRush and su 3.0) - xda-developers
起動してrootを押せば終わりです。SuperOneClickの使い方はいろいろ解説があると思うので、適当に探してみてください。

ATOKもしくはsimejiをインストールする

Kindle fireはAndroid MarketやGmailなどのgoogle appsが入っていません。インストールする方法はありますので、興味があるひとは以下のリンクとかを参考にしてみてください。
[G-Apps][GUIDE] Google Apps on the Kindle Fire - Simpler Market Instructions - xda-developers

Android Marketが使えればATOKやsimejiをAndroid Marketからインストールします。Android Marketをインストールしていない人は手持ちの他のAndroidから抜き出してきます。(なんか野良simeji公開されなくなってしまっていますね。) たぶんここが一番ハードルが高いかも。。

無事インストールできたら、ATOKもしくはsimejiを有効にします。
通常であれば、設定→言語とキーボード から有効にすればおわりなのですが、Kindle Fireのキーボードの設定はKindleキーボードの設定しかないので設定できません。

Kindle Fire Keyboard Settings

これではATOKを有効にできないので、直接設定をいじります。

Input Methodを有効にする

今度はMacで作業します。(WindowsでもLinuxでもできますが、MacでやったのでMacで書いてます)
先ほどと同じように~/.android/adb_usb.ini0x1949を追加します。

Androidの言語とキーボードの設定は、/data/data/com.android.providers.settings/databases/settings.dbに入っているので、それを抜き出して編集します。

hiro$ adb shell
$ su
# cp /data/data/com.android.providers.settings/databases/settings.db /sdcard/settings.db
# exit
$ exit
hiro$ adb pull /sdcard/settings.db .
2486 KB/s (24576 bytes in 0.009s)

抜き出したらSqliteで変更を加えます。まず現状の設定を抜き出します。

hiro$ sqlite3 settings.db 
SQLite version 3.7.5
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from secure where name like "enabled_input_methods";
69|enabled_input_methods|com.android.inputmethod.latin/.LatinIME

続いてATOKもしくはsimejiをenabled_input_methodsに追加します。ATOKおよびsimejiのpackage名は以下なので参考にしてください。

  • ATOK
    com.justsystems.atokmobile.service/.AtokInputMethodService
  • simeji
    com.adamrocker.android.input.simeji/.OpenWnnSimeji

sqlite> INSERT INTO "secure" VALUES(null,'enabled_input_methods','com.android.inputmethod.latin/.LatinIME:com.adamrocker.android.input.simeji/.OpenWnnSimeji:com.justsystems.atokmobile.service/.AtokInputMethodService');

上の例はATOKおよびsimeji両方を有効にした場合です。実行したら再度select * from secure where name like "enabled_input_methods";を実行してATOKやsimejiが入っているか確認してください。確認したらCtrl+Dで終了させます。

最後に変更を加えたsettings.dbをKindle fireに戻し、Kindle Fireを再起動します。

hiro$ adb push settings.db /sdcard/settings.db
1810 KB/s (24576 bytes in 0.013s)
hiro$ adb shell
$ su
# cp /sdcard/settings.db /data/data/com.android.providers.settings/databases/settings.db
# chown system.system /data/data/com.android.providers.settings/databases/settings.db
# chmod 660 /data/data/com.android.providers.settings/databases/settings.db
# exit
$ exit

再起動したら、どこかの入力フィールドを長押しするとInput Methodを選ぶ画面が出ますので、選択するとATOKもしくはsimejiが候補に出てきますので選択するとKindle fireで日本語が入力できるようになります!

Kindle Fire Input Method Select Screen

かなり適当にまとめてますので、抜け落ちている点などありましたら指摘していただけると幸いです。

«Prev || 1 | 2 | 3 |...| 10 | 11 | 12 || Next»

Home > Technology

Search
Feeds
Google Latitude
Tag Cloud
IPv6 Meter

Page Top