Cómo supervisar el cambio de estado de SIM

Me gustaría ser capaz de hacer algunas cosas cuando el cambio de estado SIM, es decir, reproducir un sonido cuando el PIN de la tarjeta SIM es necesario, pero creo que no hay eventos de difusión que pueden ser interceptados por un receptor de radiodifusión para este … Android.intent.action .PHONE_STATE solo le indica cuando cambia el CALL-STATE. Una alternativa puede ser iniciar un servicio que registra un PhoneStateListener y reacciona sobre un LISTEN_SERVICE_STATE (cuando el estado es OUT-OF-STATE puede obtener el SIM Estado desde el TelephonyManager y buscar si el estado es SIM_STATE_PIN_REQUIRED). Por lo tanto, mis preguntas son:

1) ¿Existe alguna intención de difusión que pueda utilizar para interceptar un cambio de estado SIM o un cambio de estado de servicio?

2) ¿ es una mala idea instalar un PhoneStateListener dentro de un Servicio y usarlo para entregar intenciones al propio Servicio tras la notificación de un estado de teléfono cambiado recibido por el PhoneStateListener ?

    La Intención android.intent.action.SIM_STATE_CHANGED se transmite cuando el estado de la SIM cambia. Por ejemplo, en mi HTC Desire con una tarjeta SIM de T-Mobile, si pongo el dispositivo en modo de vuelo, se emite el siguiente intento:

    • Propósito: android.intent.action.SIM_STATE_CHANGED con extras: ss = NOT_READY, reason = null

    Si luego lo tomo fuera del modo de vuelo, los siguientes Intents son transmitidos:

    • Intención: android.intent.action.SIM_STATE_CHANGED con extras: ss = LOCKED, reason = PIN
    • Propósito: android.intent.action.SIM_STATE_CHANGED con extras: ss = READY, reason = null
    • Intención: android.intent.action.SIM_STATE_CHANGED con extras: ss = IMSI, reason = null
    • Intención: android.intent.action.SIM_STATE_CHANGED con extras: ss = LOADED, reason = null

    Es posible que diferentes fabricantes y diferentes modelos se comporten de manera diferente. Como dicen, "su kilometraje puede variar".

    El segundo enfoque de tener un PhoneStateListener en un servicio que escucha onServiceStateChanged () funcionó para mí. Creo que en algunos dispositivos no obtendrá la emisión interna android.intent.action.SIM_STATE_CHANGED .

    La respuesta de David es inmejorable. Quería añadir algún código de ejemplo para ayudar a la gente a comenzar con la implementación de un monitor de estado.

     /** * 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, eg 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. } } } 
    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.