当"飞行模式"打开时,SIM状态的值是什么?

3
我想知道当“飞行模式”打开时,TelephonyManager.getSimState() 返回的SIM状态值是多少?似乎在SDK规范中没有直接说明。
实际上,我需要使用getSimOperator()方法获取SIM运营商代码(即MCC + MNC),但JavaDoc指出要使用该方法:
SIM状态必须为SIM_STATE_READY 更新:
我在模拟器下测试了一下,当飞行模式打开后,它返回SIM_STATE_UNKNOWN(在javadoc中描述为“状态之间的转换”)。然而,我想知道这是否是Android手机上的常见行为?
2个回答

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_OFFRADIO_UNAVAILABLE 时,将返回State.UNKNOWN。然后,TelephonyManager.getSimState() 方法将State.UNKNOWN转换为SIM_STATE_UNKNOWN 常量。

总之:当飞行模式打开时,getSimState 将返回 SIM_STATE_UNKNOWN


请问您能否修复RADIO_OFF和RADIO_UNAVAILABLE的链接? - Nirav Zaveri
1
@NiravZaveri 已完成。请注意,从Android 4.2开始,IccCard已转换为接口并被弃用。相关逻辑现在位于IccCardProxy类中。当无线电关闭时,内部使用State.NOT_READY。尽管如此,它不在公共API中,并且在getSimState()方法中转换为SIM_STATE_UNKNOWN - Idolon
通常情况下,即使飞行模式已开启,我的设备仍会进入Sim_State_Ready状态,但此时simSerialNumber将返回NULL。因此,我想查看源代码。谢谢。 - Nirav Zaveri
我在这部手机上测试代码,它运行的是Android 4.3系统。这是一款红米手机(MIUI版本45)。 - Nirav Zaveri
@NiravZaveri 那我建议你看这里:http://androidxref.com/4.3_r2.1/xref/frameworks/opt/telephony/src/java/com/android/internal/telephony/uicc/ 我有时间会去看一下。 - Idolon
显示剩余2条评论

2

是的,这是安卓手机上常见的行为。 请查看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;
    }
}

1
这并不是很简单,因为TelephonyManager.getSimState并不能显示我们手机和SIM卡状态之间的映射关系(请参见我自己的答案,其中包含负责此类操作的代码)。无论如何,还是给你点赞,因为你查看了源代码 ;) - Idolon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接