Каково значение состояния SIM-карты при включении «режима полета»

#android #telephony #sim-card #airplane

#Android #телефония #sim-карта #режим полета

Вопрос:

Интересно, какое значение состояния SIM-карты возвращается TelephonyManager.getSimState() при включении «режима полета»? Похоже, это нигде напрямую не указано в спецификации SDK.

На самом деле мне нужно получить код оператора SIM-карты (т. Е. MCC MNC) с помощью getSimOperator() метода, но JavaDoc утверждает, что для использования этого метода:

Состояние SIM-карты должно быть SIM_STATE_READY

Обновить

Я протестировал его в эмуляторе, и он возвращается SIM_STATE_UNKNOWN (который описывается javadoc как «переход между состояниями») после включения режима полета. Однако я хотел бы знать, является ли это обычным поведением на телефонах Android?

Ответ №1:

После поиска источников Android 4.1 я нашел следующий код в одном из частных классов com.android.internal.telephony.IccCard :

 public State getState() {
  if (mState == null) {
      switch(mPhone.mCM.getRadioState()) {
          /* This switch block must not return anything in
           * State.isLocked() or State.ABSENT.
           * If it does, handleSimStatus() may break
           */
          case RADIO_OFF:
          case RADIO_UNAVAILABLE:
          case SIM_NOT_READY:
          case RUIM_NOT_READY:
              return State.UNKNOWN;
          case SIM_LOCKED_OR_ABSENT:
          case RUIM_LOCKED_OR_ABSENT:
              //this should be transient-only
              return State.UNKNOWN;
          case SIM_READY:
          case RUIM_READY:
          case NV_READY:
              return State.READY;
          case NV_NOT_READY:
              return State.ABSENT;
      }
  } else {
      return mState;
  }

  Log.e(mLogTag, "IccCard.getState(): case should never be reached");
  return State.UNKNOWN;
}  
 

So State.UNKNOWN будет возвращаться всякий раз, когда состояние радиосвязи является одним из RADIO_OFF или RADIO_UNAVAILABLE. Затем State.UNKNOWN будет преобразован в SIM_STATE_UNKNOWN константу TelephonyManager.getSimState() методом.

В качестве вывода: при включении режима полета вернется getSimState SIM_STATE_UNKNOWN .

Комментарии:

1. Не могли бы вы исправить ссылки на RADIO_OFF и RADIO_UNAVAILABLE ?

2. @NiravZaveri готово. Пожалуйста, обратите внимание, что начиная с Android 4.2 IccCard , он был преобразован в интерфейс и устарел. Связанная логика теперь находится в классе IccCardProxy. И внутренне State.NOT_READY используется, когда радио выключено. Тем не менее, он недоступен в общедоступном API и преобразуется SIM_STATE_UNKNOWN в getSimState() метод.

3. Спасибо. Что обычно происходит со мной, так это то, что даже когда включен режим полета, он переходит в Sim_State_Ready даже в режиме полета, но также возвращает simSerialNumber как NULL, а затем после. Вот почему я хотел взглянуть на исходный код.

4. @NiravZaveri Какая у вас версия Android?

5. У меня есть Android 4.3 на этом телефоне, где я тестирую код. Это телефон Redmi (версия MIUI 45).

Ответ №2:

да, это обычное поведение на телефонах Android. смотрите реализацию метода getSimState() из класса TelephonyManager:

 public int getSimState() {
    String prop = SystemProperties.get(TelephonyProperties.PROPERTY_SIM_STATE);
    if ("ABSENT".equals(prop)) {
        return SIM_STATE_ABSENT;
    }
    else if ("PIN_REQUIRED".equals(prop)) {
        return SIM_STATE_PIN_REQUIRED;
    }
    else if ("PUK_REQUIRED".equals(prop)) {
        return SIM_STATE_PUK_REQUIRED;
    }
    else if ("NETWORK_LOCKED".equals(prop)) {
        return SIM_STATE_NETWORK_LOCKED;
    }
    else if ("READY".equals(prop)) {
        return SIM_STATE_READY;
    }
    else {
        return SIM_STATE_UNKNOWN;
    }
}
 

Комментарии:

1. Это не так просто, поскольку TelephonyManager.getSimState не показывает нам сопоставление между состояниями телефона и SIM-карты (см. Мой собственный ответ для кода, который отвечает за это). В любом случае вам 1 за просмотр источника 😉