4

我有一个简单的问题 :

 TelephonyManager.getDeviceId();

设备中没有 SIM 卡(SIM_STATE_ABSENT)可以工作吗?

4

2 回答 2

2

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

更新:根据文档,getDeviceId() 返回 GSM 设备的 IMEI。而且 IMEI 不是 SIM 卡功能,它是设备自带的。

于 2013-02-28T00:51:36.180 回答
1

代码对话:

最后telephony.getDeviceId()调用Phone.getDeviceId(),这个方法的实现在CDMA手机和GSM手机等不同的手机上是不同的。例如,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 ABSENT 状态。因此,您当然可以在没有 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 无关。

于 2013-02-28T01:30:08.667 回答