セルスタンバイ問題対応でよくあるregCodeToServiceStateのレスポンスを変更する方法だと
普通にボイスレジスト(CS)が拒否されても問題なし状態になってしまうので複数キャリアの切替や
ローミング使用時に問題が発生するのであまりやりたくない。全体的に不親切なメモ。
データ専用SIM(持っているiijmio限定)が正しい通信状態になりセルスタンバイ問題が改善すること。
「NTT DOCOMO/NTT DOCOMO」みたいなSPNとPLMNの二重表示は格好悪いので「NTT DOCOMO」表記にする。
海外利用もあるのでローミングも問題なく行えること(海外SIMが正しく使えること)。表記も同じく。
ソースからのコンパイルは時間もかかるので面倒(これ重要)なのでframework.jar修正でなんとかする。
framework.jarを端末から取得しておく。バックアップも必ず行う。
http://bl.oov.ch/2012/01/b-mobile-sim.html が参考になります。
Android Jelly Beans のコードを眺めていたら以下のようになっているみたい。
GsmServiceStateTracker.java Line.722 〜
cm.getOperator //オペレータを探す
cm.getDataRegistrationState //データ(PS)のレジスト
cm.getVoiceRegistrationState //ボイス(CS)のレジスト
cm.getNetworkSelectionMode //ネットワーク選択
GsmServiceStateTracker.java Line.639 〜 (getDataRegistrationStateの戻り処理内)
newGPRSState = regCodeToServiceState(regState); //regState→ServiceStateに置換→変数へ
mDataRoaming = regCodeIsRoaming(regState); //ローミングチェック
GsmServiceStateTracker.java Line.600 〜 (getVoiceRegistrationStateの戻り処理内)
mGsmRoaming = regCodeIsRoaming(regState); //ローミングチェック
newSS.setState (regCodeToServiceState(regState)); //regState→ServiceStateに置換→全体設定
ということでData側の都合に関わらずVoice側のサービス状況が優先されることになっています。
PSとCSとのレジスト関係はiij様のblog記事が詳しいです。http://techlog.iij.ad.jp/archives/487
なんでsetStateの前あたりにデータ(PS)のサービス状況を確認して(CSに)採用してもらえば良さそうです。 具体的にはCSのregStateが13(拒否:緊急通話のみ)の時のみPSの状況がOKならCSでもregStateを1にします。
if( regState == 13 ){ // 3 is "registration denied" / 13 = 3 + "emergency call" if( newSS.getState() == ServiceState.STATE_IN_SERVICE ){ // STATE_IN_SERVICE = 0 regState = 1; } }
ソースからコンパイルしたいところですけどコンパイルに非常に時間がかかるのでsmali修正(GsmServiceStateTracker.smali)で
.line601の下に追記 iget v0, v0, Lcom/android/internal/telephony/gsm/GsmServiceStateTracker;->newGPRSState:I move/from16 v14, v0 const/16 v13, 0xd if-ne v9, v13, :cond_60f if-nez v14, :cond_60f const/4 v9, 0x1 :cond_60f
あとはコンパイルし直してframework.jarをsystemに書き込むだけです。recovery起動で置換すればroot化しなくてもよいので楽です。
adb reboot bootloader fastboot boot recovery-clockwork-5.5.0.2-maguro.img adb shell mount /data adb shell mount /system adb push framework.jar /data/ adb shell mv /data/framework.jar /system/framework/framework.jar adb shell umount /data adb shell umount /system adb reboot
エラーがでたらバックアップから戻しましょう。
「NTT DOCOMO/NTTDOCOMO」対策。SPNとPLMNが一緒だったらSPNを表示しないようにしているだけです。ジャンプ先のcond_f2は直後のジャンプに合わせて変えること。 GsmServiceStateTracker.java Line.521 〜
.line 513 以下適当な場所に invoke-static {v5, v1}, Landroid/text/TextUtils;->equals(Ljava/lang/CharSequence;Ljava/lang/CharSequence;)Z move-result v8 if-nez v8, :cond_f2
以上
てくろぐ(iij):http://techlog.iij.ad.jp/archives/487
paste.bin:いろいろ