web-dev-qa-db-fra.com

Comment surveiller le changement d'état SIM

J'aimerais pouvoir faire des trucs lorsque l'état SIM change, c'est-à-dire de jouer un son lorsque SIM PIN est requis, mais je pense qu'il n'y a pas d'événements de diffusion pouvant être interceptés par un récepteur de diffusion pour cette ... Enregistrement de Android.Intent.action.action . Téléphone_state ne vous dit que lorsque l'état d'appel change. Une alternative peut être Démarrage d'un service qui enregistre un PhoneStatelistener et réagit sur une écoute_service_state (lorsque l'état est hors état, il peut obtenir l'état SIM de la TéléphonieManager Et regardez si l'état est sim_state_pin_required). Donc, mes questions sont:

1) Y a-t-il une intention de diffusion que je peux utiliser pour intercepter un changement d'état SIM ou un changement d'état de service?

2) Est-ce une mauvaise idée d'installer un phonestatelistener dans un service et utilisez-le pour fournir des intentions au service lui-même La notification d'un état de téléphone a été modifiée par le PhoneStatelistener ?

25
Gianni Costanzi

L'intention Android.intent.action.SIM_STATE_CHANGED est diffusé lorsque l'état SIM change. Par exemple, sur mon désir HTC avec une carte SIM T-mobile, si je mettez le périphérique en mode vol, l'intention suivante est diffusée:

  • Intention: Android.Intent.Action.sim_state_changned avec des extras: SS = NOT_READY, raison = null

Si je le découle ensuite du mode de vol, les intentions suivantes sont diffusées:

  • Intention: Android.Intent.action.sim_state_changned avec extras: SS = verrouillé, raison = broche
  • Intention: Android.Intent.Action.sim_state_changned avec des extras: SS = prêt, raison = null
  • Intention: Android.Intent.Action.sim_state_changned avec des extras: SS = IMSI, raison = null
  • Intention: Android.Intent.Action.sim_state_changned avec des extras: SS = chargé, raison = null

Il est possible que différents fabricants et différents modèles se comportent différemment. Comme on dit, "ton kilométrage peut varier".

28
David Wasser

La réponse de David est sur place. Je voulais ajouter un exemple de code pour aider les personnes à démarrer avec la mise en œuvre d'un tel moniteur d'état.

/**
 * 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.
        }
    }
}
4
Tim

La deuxième approche d'avoir A phonestatelistener dans un service qui écoute Onservicestatechanged () a fonctionné pour moi. Je crois que sur certains appareils, vous n'obtiendrez pas la diffusion interne Android.intent.action.SIM_STATE_CHANGED.

1
VladimirVip