TelephonyManager.getDeviceId会在没有Sim卡的情况下工作吗?

时间:2013-02-27 20:49:57

标签: android

我有一个简单的问题:

 TelephonyManager.getDeviceId();

在没有设备中的SIM卡(SIM_STATE_ABSENT)的情况下工作吗?

2 个答案:

答案 0 :(得分:2)

它应该工作。我刚刚在我的CDMA Galaxy nexus上测试了它,它返回了一个值,即使它根本没有SIM卡。当我在模拟器上运行它时,它返回了一串长的零。

更新:根据documentation,getDeviceId()返回GSM设备的IMEI。并且IMEI不是SIM卡功能,它随设备一起提供。

答案 1 :(得分:1)

代码谈判:

telephony.getDeviceId()最终调用Phone.getDeviceId(),这种方法的实现在CDMA Phone和GSM Phone等不同手机上有所不同。例如,CDMA手机。

public String getMeid() {
    return mMeid;
}
//returns MEID or ESN in CDMA
public String getDeviceId() {
    String id = getMeid();
    if ((id == null) || id.matches("^0*$")) {
        Rlog.d(LOG_TAG, "getDeviceId(): MEID is not initialized use ESN");
        id = getEsn();
    }
    return id;
}

它没有检查SIM禁用状态。所以当然你可以在没有SIM卡的情况下获得结果。

但是,请查看此mMeid重置的时间。

case EVENT_GET_IMEI_DONE:
            ar = (AsyncResult)msg.obj;

            if (ar.exception != null) {
                break;
            }

            mImei = (String)ar.result;
case EVENT_RADIO_AVAILABLE: {
            mCM.getBasebandVersion(
                    obtainMessage(EVENT_GET_BASEBAND_VERSION_DONE));

            mCM.getIMEI(obtainMessage(EVENT_GET_IMEI_DONE));
            mCM.getIMEISV(obtainMessage(EVENT_GET_IMEISV_DONE));
        }

因此它会在收到EVENT_RADIO_AVAILABLE消息时重置。该事件是从RIL发送的。只有当它收到EVENT_RADIO_AVAILABLE消息时,它才会发送一条消息来请求设备标识。虽然获取设备标识与SIM卡无关,但EVENT_RADIO_AVAILABLE可能会做(需要进一步确认)。

我进一步检查系统何时发送EVENT_RADIO_AVAILABLE消息。最后发现RadioState包含:

enum RadioState {
    RADIO_OFF,         /* Radio explictly powered off (eg CFUN=0) */
    RADIO_UNAVAILABLE, /* Radio unavailable (eg, resetting or not booted) */
    SIM_NOT_READY,     /* Radio is on, but the SIM interface is not ready */
    SIM_LOCKED_OR_ABSENT,  /* SIM PIN locked, PUK required, network
                           personalization, or SIM absent */
    SIM_READY,         /* Radio is on and SIM interface is available */
    RUIM_NOT_READY,    /* Radio is on, but the RUIM interface is not ready */
    RUIM_READY,        /* Radio is on and the RUIM interface is available */
    RUIM_LOCKED_OR_ABSENT, /* RUIM PIN locked, PUK required, network
                              personalization locked, or RUIM absent */
    NV_NOT_READY,      /* Radio is on, but the NV interface is not available */
    NV_READY;          /* Radio is on and the NV interface is available */
    ...
}

当isAvailable()返回true时,它将发出事件。而imei将会更新。

public boolean isAvailable() {
    return this != RADIO_UNAVAILABLE;
}

因此,SIM_ABSENT与设备ID无关。