Каково значение состояния SIM-карты при включенном «режиме полета» - PullRequest
3 голосов
/ 21 октября 2011

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

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

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

ОБНОВЛЕНИЕ

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

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

После поиска в источниках 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;
}  

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

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

2 голосов
/ 21 октября 2011

да, это обычное поведение на телефонах 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;
    }
}
...