4

簡単な質問があります:

しますか

 TelephonyManager.getDeviceId();

デバイスにSIMカード(SIM_STATE_ABSENT)がなくても機能しますか?

4

2 に答える 2

2

動作するはずです。CDMAギャラクシーネクサスでこれをテストしたところ、SIMカードがまったくないにもかかわらず、値が返されました。エミュレーターで実行すると、ゼロの長い文字列が返されました。

更新:ドキュメントによると、getDeviceId()はGSMデバイスのIMEIを返します。また、IMEIはSIMカード機能ではなく、デバイスに付属しています。

于 2013-02-28T00:51:36.180 に答える
1

コードトーク:

最後に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とは何の関係もありません。

于 2013-02-28T01:30:08.667 に答える