2012年1月19日

Android + データ専用 SIM で「緊急通報のみ」を消す

こういうの。

※既にバッチファイル内で自動化処理も入ってます。

データ通信専用 SIM では実際には試してないけど恐らく緊急通報できないのだろうから「緊急通報のみ」も消してしまっていいのではないか、ということで消し方に関する話。
触るファイルは「Android + b-mobile データ専用 SIM で電界強度を表示する」の時と一緒で com\android\internal\telephony\gsm\GsmServiceStateTracker.smali になる。基本的な流れも大体一緒なので改変する箇所に関してだけ書いておきます。

無効化方法について書きますが自己責任でお願いします。
わからないことがあれば聞かずにご自分でお調べください。私にもわかりません。

元ソースで見ると以下の箇所がポイント。
GsmServiceStateTracker.java#L590
if (regState == 10 || regState == 12 || regState == 13 || regState == 14) {
    mEmergencyOnly = true;
} else {
    mEmergencyOnly = false;
}
regState が 10, 12, 13, 14 の時「緊急通報のみ」のモードが true になるので、ここを false に変えることで、どんな時でも「緊急通報のみ」を無効化できるはず。

smali ファイルではまず「Lcom/android/internal/telephony/gsm/GsmServiceStateTracker;->regCodeToServiceState(I)I」で検索してみると、この時点で恐らく2件ヒットするはず。
そこから先が以下のようになっている方が目的の箇所(例によって環境により細かい数字類は異なると思う)。
invoke-direct {v0, v1}, Lcom/android/internal/telephony/gsm/GsmServiceStateTracker;->regCodeToServiceState(I)I

    move-result v15

    invoke-virtual {v14, v15}, Landroid/telephony/ServiceState;->setState(I)V

    .line 684
    const/16 v14, 0xa

    if-eq v10, v14, :cond_166

    const/16 v14, 0xc

    if-eq v10, v14, :cond_166

    const/16 v14, 0xd

    if-eq v10, v14, :cond_166

    const/16 v14, 0xe

    if-ne v10, v14, :cond_1a4

    .line 685
    :cond_166
    const/4 v14, 0x1 ← ここを 0x0 に書き換える
この変更だけで、「緊急通報のみ」は常に無効になってキャリア名が出るようになると思います。
全ての環境で上手くいくかは相変わらずわかりませんが、上手くいったらよかったねということで。
あと、これで無効化してしまうと本当に「緊急通報のみ」の状態になった時にわからなくなってしまうので、データ通信専用ではない SIM を使う場合はちゃんと元に戻した方がいいと思います。

「『緊急通報のみ』を消す=データ通信専用表示になる」というわけではないと思うので、特にいいことがあるかどうかはわかりません。
Clip to Evernote