2011-10-21 69 views
3

我想知道當打開「飛行模式」時,由TelephonyManager.getSimState()返回的SIM狀態的值是多少?這似乎不是在SDK規範的任何地方直接指定的。當「飛行模式」打開時,SIM狀態的值是多少

其實我需要使用getSimOperator()方法獲取SIM運營商代碼(即MCC + MNC),但使用該方法的JavaDoc狀態:

SIM狀態必須SIM_STATE_READY

UPDATE

我在模擬器下測試它,它返回SIM_STATE_UNKNOWN(javadoc將其描述爲「狀態之間的轉換」 )在飛機模式打開後。不過,我想知道這是Android手機上的常見行爲嗎?

回答

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; 
} 

所以State.UNKNOWN會無論何時無線電狀態爲RADIO_OFFRADIO_UNAVAILABLE之一時都會返回。然後State.UNKNOWN將通過TelephonyManager.getSimState()方法轉換爲SIM_STATE_UNKNOWN常數。

由於結論:當飛機模式打開時getSimState將返回SIM_STATE_UNKNOWN

+0

你能修復鏈接到RADIO_OFF和RADIO_UNAVAILABLE嗎? –

+1

@NiravZaveri完成。請注意,從Android 4.2'IccCard'開始,已轉換爲接口並已被棄用。相關邏輯現在位於[IccCardProxy]類(http://androidxref.com/4.2_r1/xref/frameworks/opt/telephony/src/java/com/android/internal/telephony/IccCardProxy.java#264)class。在收音機關閉時使用內部'State.NOT_READY'。然而,它在公共API中不可用,並且它在'getSimState()'方法中被轉換爲'SIM_STATE_UNKNOWN'。 – Idolon

+0

謝謝。 即使在飛行模式打開的情況下,即使在飛行模式下也會進入Sim_State_Ready模式,但通常情況下我會發生什麼情況,但是也會將simSerialNumber返回爲NULL,然後返回。這就是爲什麼我想看看源代碼。 –

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查看源代碼;) – Idolon

相關問題