#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()
метод.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 за просмотр источника 😉