我有一个简单的问题:
TelephonyManager.getDeviceId();
在没有设备中的SIM卡(SIM_STATE_ABSENT)的情况下工作吗?
答案 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无关。