28

SIMの状態が変化したときに、つまりSIM PINが必要なときにサウンドを再生できるようにしたいのですが、このために放送受信機が傍受できる放送イベントはないと思います...登録android.intent.action .PHONE_STATEは、CALL-STATEが変更されたときにのみ通知します。代わりに、PhoneStateListenerを登録し、LISTEN_SERVICE_STATEに反応するサービスを開始することもできます(状態がOUT-OF-STATEの場合、SIMを取得できます。TelephonyManagerから状態を確認し、状態がSIM_STATE_PIN_REQUIREDであるかどうかを確認します。だから、私の質問は次のとおりです。

1) SIMの状態変化またはサービス状態の変化を傍受するために使用できるブロードキャストインテントはありますか?

2)PhoneStateListenerをサービス内にインストールし、それを使用して、 PhoneStateListenerが受信した電話の状態が変更されたという通知を受け取ったときに、サービス自体にインテントを配信するのは悪い考えですか?

4

3 に答える 3

33

インテントandroid.intent.action.SIM_STATE_CHANGEDは、SIMの状態が変化したときにブロードキャストされます。たとえば、T-MobileSIMカードを搭載したHTCDesireで、デバイスを機内モードにすると、次のインテントがブロードキャストされます。

  • インテント:android.intent.action.SIM_STATE_CHANGED with extras:ss = NOT_READY、reason = null

その後、機内モードを解除すると、次のインテントがブロードキャストされます。

  • インテント:android.intent.action.SIM_STATE_CHANGED with extras:ss = LOCKED、reason = PIN
  • インテント:android.intent.action.SIM_STATE_CHANGED with extras:ss = READY、reason = null
  • インテント:android.intent.action.SIM_STATE_CHANGED with extras:ss = IMSI、reason = null
  • インテント:android.intent.action.SIM_STATE_CHANGED with extras:ss = LOADED、reason = null

メーカーやモデルが異なれば、動作も異なる可能性があります。彼らが言うように、「あなたのマイレージは変わるかもしれません」。

于 2012-05-11T14:36:55.000 に答える
5

デビッドの答えは的確です。人々がそのような状態モニターの実装を開始できるように、いくつかのサンプルコードを追加したいと思いました。

/**
 * Handles broadcasts related to SIM card state changes.
 * <p>
 * Possible states that are received here are:
 * <p>
 * Documented:
 * ABSENT
 * NETWORK_LOCKED
 * PIN_REQUIRED
 * PUK_REQUIRED
 * READY
 * UNKNOWN
 * <p>
 * Undocumented:
 * NOT_READY (ICC interface is not ready, e.g. radio is off or powering on)
 * CARD_IO_ERROR (three consecutive times there was a SIM IO error)
 * IMSI (ICC IMSI is ready in property)
 * LOADED (all ICC records, including IMSI, are loaded)
 * <p>
 * Note: some of these are not documented in
 * https://developer.android.com/reference/android/telephony/TelephonyManager.html
 * but they can be found deeper in the source code, namely in com.android.internal.telephony.IccCardConstants.
 */
public class SimStateChangedReceiver extends BroadcastReceiver {

    /**
     * This refers to com.android.internal.telehpony.IccCardConstants.INTENT_KEY_ICC_STATE.
     * It seems not possible to refer it through a builtin class like TelephonyManager, so we
     * define it here manually.
     */
    private static final String EXTRA_SIM_STATE = "ss";

    @Override
    public void onReceive(Context context, Intent intent) {

        String state = intent.getExtras().getString(EXTRA_SIM_STATE);
        if (state == null) {
            return;
        }

        // Do stuff depending on state   
        switch (state) {      
            case "ABSENT": break;
            case "NETWORK_LOCKED": break;
            // etc.
        }
    }
}
于 2017-04-24T13:00:46.437 に答える
2

onServiceStateChanged()をリッスンするサービスにPhoneStateListenerを設定する2番目のアプローチがうまくいきました。一部のデバイスでは、内部ブロードキャストを取得できないと思います。android.intent.action.SIM_STATE_CHANGED

于 2014-01-16T16:51:53.560 に答える