我想知道“飞行模式”打开时TelephonyManager.getSimState()
返回的SIM状态值是多少?这似乎没有在SDK规范中的任何地方直接指定。
实际上我需要使用getSimOperator()
方法获取SIM操作员代码(即MCC + MNC),但JavaDoc声明要使用该方法:
SIM状态必须为SIM_STATE_READY
更新
我在模拟器下测试了它,并在飞机模式打开后返回SIM_STATE_UNKNOWN
(由javadoc描述为“状态之间的过渡”)。不过我想知道它是否是Android手机上的常见行为?
答案 0 :(得分:3)
在搜索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;
}
每当无线电状态为RADIO_OFF或RADIO_UNAVAILABLE之一时,都会返回State.UNKNOWN
。然后,State.UNKNOWN
将SIM_STATE_UNKNOWN
方法转换为TelephonyManager.getSimState()
常量。
结论是:当启用飞行模式时getSimState
将返回SIM_STATE_UNKNOWN
。
答案 1 :(得分:2)
是的,这是Android手机上的常见行为。 请参阅TelephonyManager类中的getSimState()方法的实现:
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;
}
}