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 ?
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:
Si je le découle ensuite du mode de vol, les intentions suivantes sont diffusées:
Il est possible que différents fabricants et différents modèles se comportent différemment. Comme on dit, "ton kilométrage peut varier".
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.
}
}
}
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
.