Skip to content

Desire HD × b-mobileSIM で電波強度取得

Posted by admin  2011-06-18 07:25 am

Desire HD (SIMフリー化した001HT)でb-mobileSIMやXiSIMみたいな
データ専用SIMを使おうとすると、通信サービスなし状態になって電波強度が取得できない。
radioとRILとSIMの相性が悪いらしいんだが、わりと不便。

CAP201103311631

とりあえずの代替策として「RealSignal」みたいなアプリを使っている。
(APIv7のgetGsmSignalStrengthで取得可能である)

CAP201106180703

ここで、ステータスバーのアンテナが圏外表示になる仕組みを調べたところ、
次のようになっていた。

StatusBarPolicy.java – AOSP

private final void updateSignalStrength() {
    int iconLevel = -1;
    int[] iconList;

    // Display signal strength while in "emergency calls only" mode
    if (mServiceState == null || (!hasService() && !mServiceState.isEmergencyOnly())) {
        //Slog.d(TAG, "updateSignalStrength: no service");
        if (Settings.System.getInt(mContext.getContentResolver(),
                Settings.System.AIRPLANE_MODE_ON, 0) == 1) {
            mPhoneSignalIconId = R.drawable.stat_sys_signal_flightmode;
        } else {
            mPhoneSignalIconId = R.drawable.stat_sys_signal_null;
        }
        mService.setIcon("phone_signal", mPhoneSignalIconId, 0);
        // set phone_signal visibility false if hidden
        if (mPhoneSignalHidden) {
            mService.setIconVisibility("phone_signal", false);
        }
        return;
    }

    if (!isCdma()) {
        int asu = mSignalStrength.getGsmSignalStrength();

        // ASU ranges from 0 to 31 - TS 27.007 Sec 8.5
        // asu = 0 (-113dB or less) is very weak
        // signal, its better to show 0 bars to the user in such cases.
        // asu = 99 is a special case, where the signal strength is unknown.
        if (asu <= 2 || asu == 99) iconLevel = 0;
        else if (asu >= 12) iconLevel = 4;
        else if (asu >= 8)  iconLevel = 3;
        else if (asu >= 5)  iconLevel = 2;
        else iconLevel = 1;
        (略)

つまり、「hasService()」の判定で圏外扱いされているらしい。

確かにそれはそれで正しいんだろうけど、

DHD×bmobileみたいにサービスなしで通信してる場合困る。

(そんな例外認めたくないけどw)

そんなわけで同ファイルの少し上にあるのhasService()のところをちょっと改変した

private boolean hasService() {
    if (mServiceState != null) {
        switch (mServiceState.getState()) {
            // case ServiceState.STATE_OUT_OF_SERVICE:
            case ServiceState.STATE_POWER_OFF:
                return false;
            default:
                return true;
        }
    } else {
        return false;
    }
}

1034行目、STATE_OUT_OF_SERVICE状態の判定をコメントアウト。

弊害としてはSIMなし時にもSTATE_OUT_OF_SERVICEと判定されるので、

アンテナだけ見るとSIMを認識していないのか圏外なのかわからないということぐらいかな。

ただ、SIM認識していないときは、エラーアイコンが出るので大丈夫だと思うが…

んで、SystemUI.apkをビルドし直して入れ替えた結果がこちら↓

CAP201106180748

↑カバーなしの状態

CAP2011061807501

↑カバーを付けた状態

ちゃんとデータ通信のアイコンも出るようになった。

これをやったところで

「ネットワークに接続していません」

エラーが出なくなるわけでもないんだけどねw

完全に自己満足です、はい。

おまけ:

今回改変したSystemUI.apk DL

ただし、CyanogenMod7のgitからビルドしたものなので、それ以外で使えるか不明。

当然自己責任で。

From → Android, Gadget

次の記事前の記事関連記事
コメント(3)
  1. TI on 2011-06-24 09:41 pm

    この場合、セルスタンバイによるバッテリー食いは緩和されますでしょうか?

    • uMI on 2011-06-25 10:25 pm

      残念ながら見た目だけの問題なので変わらないと思います・・・。

  2. TI on 2011-06-26 08:18 pm

    ご回答ありがとうございます。お手数おかけしました。

この記事へのコメントは終了しました。