Как отслеживать изменение состояния SIM-карты

Я хотел бы иметь возможность выполнять некоторые действия при изменении состояния SIM-карты, то есть воспроизводить звук, когда требуется PIN-код SIM-карты, но я думаю, что нет событий Broadcast, которые могут быть перехвачены приемником широковещательной передачи для этого ... регистрация дляandroid.intent.action.PHONE_STATE сообщает вам только когда CALL-STATE изменяется. Альтернативой может быть запуск службы, которая регистрируетPhoneStateListener и реагирует на LISTEN_SERVICE_STATE (когда состояние вне состояния, оно может получить состояние SIM-карты изTelephonyManager и посмотрите, является ли состояние SIM_STATE_PIN_REQUIRED). Итак, мои вопросы:

1) Есть ли какие-либо намерения вещания, которые я могу использовать для перехвата изменения состояния SIM-карты или состояния службы?

2) это плохая идея установитьPhoneStateListener внутри Сервиса и использовать его для доставки намерений в сам Сервис после уведомления об изменении состояния телефона, полученногоPhoneStateListener?

Ответы на вопрос(3)

PhoneStateListener в Службе, которая слушаетonServiceStateChanged () работал на меня. Я считаю, что на некоторых устройствах вы не получите внутреннюю трансляциandroid.intent.action.SIM_STATE_CHANGED.

 patrickf05 июн. 2015 г., 15:17
«Я считаю, что на некоторых устройствах вы не получите внутреннюю трансляцию» - я думаю, что вы столкнетесь с функцией безопасности, при которой трансляция не будет доставлена, если приложение еще не было запущено пользователем или принудительно остановлено

чтобы помочь людям начать реализацию такого монитора состояния.

/**
 * 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.
        }
    }
}
 Tomás Rodrigues15 сент. 2017 г., 20:17
работает как шарм! + 1
Решение Вопроса

android.intent.action.SIM_STATE_CHANGED передается при изменении состояния SIM-карты. Например, на моем HTC Desire с SIM-картой T-Mobile, если я перевожу устройство в режим полета, передается следующее намерение:

Intent: android.intent.action.SIM_STATE_CHANGED с дополнительными функциями: ss = NOT_READY, reason = null

Если я вывожу его из режима полета, будут транслироваться следующие материалы:

Intent: android.intent.action.SIM_STATE_CHANGED с дополнительными функциями: ss = LOCKED, причина = PINIntent: android.intent.action.SIM_STATE_CHANGED с дополнительными функциями: ss = READY, причина = нольIntent: android.intent.action.SIM_STATE_CHANGED с дополнительными функциями: ss = IMSI, причина = нольIntent: android.intent.action.SIM_STATE_CHANGED с дополнительными функциями: ss = LOADED, причина = ноль

Возможно, что разные производители и разные модели ведут себя по-разному. Как говорится, «Ваш пробег может отличаться».

 Gianni Costanzi11 мая 2012 г., 17:00
Большое спасибо! Где мне найти эту информацию в справочных документах по Android? Под каким классом задокументировано это намерение?
 Gianni Costanzi12 мая 2012 г., 08:37
Я тестировал свой HTC One X, и он работает, большое спасибо! Я не понимаю, почему некоторые вещи так плохо документированы в официальной ссылке на SDK (или, возможно, документация существует, но ее трудно найти)
 David Wasser11 мая 2012 г., 18:54
Я понятия не имею, документировано ли это или где это. Я обнаружил это эмпирически, просмотрев logcat, чтобы увидеть, какие Intents транслируются, когда происходят определенные события телефонии, а затем написал небольшие тестовые программы, которые прослушивают эти события и выгружают их содержимое. Поскольку многое из этого зависит от поставщика, вам придется самому в этом разобраться. Рад, что я могу помочь.
 Gianni Costanzi15 мая 2012 г., 09:44
Спасибо тебе, Дэвид, я смог опубликовать свое первое приложение для Android на SIM-карт Play.google.com / магазин / приложения / ...
 Illegal Argument19 сент. 2015 г., 17:08
это не упомянуто в документах, для которых исходный код Android имеет намерение использовать класс TelephonyIntents с предупреждением никогда их не слушать Android.googlesource.com / платформы / рамки / основание / + / cd92588 / ...

Ваш ответ на вопрос