簡単な質問があります:
しますか
TelephonyManager.getDeviceId();
デバイスにSIMカード(SIM_STATE_ABSENT)がなくても機能しますか?
簡単な質問があります:
しますか
TelephonyManager.getDeviceId();
デバイスにSIMカード(SIM_STATE_ABSENT)がなくても機能しますか?
動作するはずです。CDMAギャラクシーネクサスでこれをテストしたところ、SIMカードがまったくないにもかかわらず、値が返されました。エミュレーターで実行すると、ゼロの長い文字列が返されました。
更新:ドキュメントによると、getDeviceId()はGSMデバイスのIMEIを返します。また、IMEIはSIMカード機能ではなく、デバイスに付属しています。
コードトーク:
最後にPhone.getDeviceId()を呼び出します。telephony.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;
}
そのSIMABSENT状態のチェックはありません。したがって、もちろん、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メッセージを受信した場合にのみ、デバイスIDを要求するメッセージを送信します。デバイスIDの取得は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とは何の関係もありません。