我有一个简单的问题 :
做
TelephonyManager.getDeviceId();
设备中没有 SIM 卡(SIM_STATE_ABSENT)可以工作吗?
它应该工作。我刚刚在我的 CDMA Galaxy Nexus 上进行了测试,它返回了一个值,即使它根本没有 SIM 卡。当我在模拟器上运行它时,它返回了一长串零。
更新:根据文档,getDeviceId() 返回 GSM 设备的 IMEI。而且 IMEI 不是 SIM 卡功能,它是设备自带的。
代码对话:
最后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 无关。