28

デバイス識別子 (ANDROID_ID) に依存するアプリをエミュレーターでテストしたいと考えています。

現在、次のコードでデバイス識別子を取得しています。

final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);

これをエミュレータで実行すると が返されnull、あらゆる種類の問題が発生します。より高い Android バージョンでは何かが返されるようです。

Android エミュレーターでデバイス識別子を取得する方法はありますか? デバイス ID を間違って取得していますか?

コンソールからエミュレータのデバイス識別子を設定することは可能でしょうか?

4

4 に答える 4

39

エミュレーターでは、IMEI と IMSI の値がハードコーディングされています。

2325     { "+CIMI", OPERATOR_HOME_MCCMNC "000000000", NULL },   /* request internation subscriber identification number */
2326     { "+CGSN", "000000000000000", NULL },   /* request model version */

したがって、常に取得しnullます。

これらの ID 番号をテストに引き続き使用し、エミュレーターと実際のデバイスで同じコードを保持したい場合は、エミュレーターで何らかの方法でコードを変更する必要があります。

それを行うには、少なくとも 2 つの方法があります。

  1. コード内の値を変更し、エミュレータ用にコードを再コンパイルします。ただし、これは複雑すぎて時間がかかる場合があります... :-)

  2. エミュレーターのバイナリーを「ハック」し (圧縮も暗号化もされていないため、できます!)、文字列をその場で (適切な場所で) 変更します。

方法は次のとおりです。

  • エミュレータのバイナリをバックアップします (後でロールバックします)。Windows では、バイナリは Android の「\tools」フォルダーにある「emulator.exe」という名前で見つけることができます。

  • お気に入りの16進エディタでバイナリを開きます

  • +CGSN文字列の後に null バイトが続くものを検索します (その後に 15 桁の IMEI 番号が続く必要があります - 以下の印刷画面を参照してください)

代替テキスト

  • 番号を編集します(元の桁数を変更しないように注意してください)

  • ファイルを保存します。

  • コードを変更/調整して、IDにIMEIを使用するFalmariか(指摘されているように)、このトリックを使用して他の値を変更します。

于 2010-12-09T22:02:32.447 に答える
2

Falmarri が言うように、デバイス ID はエミュレーターで 0 になります。このメソッドを使用して、パラメーターの組み合わせに基づいて一意のデバイス ID を生成します (エミュレーターと HTC Desire を広範囲にテストしていませんが、うまくいくようです) - 私の方法ではありません (思い出せません)。私がそれを掘り起こした場所-しかし、それが原因である帰属)

/*
 * Creates a UUID specific to the device. There are possibly some instances where this does
 * not work e.g. in the emulator or if there is no SIM in the phone.
 */
public static void setDeviceUUID(Context context)
{
    final TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);

    final String tmDevice, tmSerial, androidId;
    tmDevice = "" + tm.getDeviceId();
    tmSerial = "" + tm.getSimSerialNumber();
    androidId = "" + Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);

    deviceMobileNo = tm.getLine1Number();

    UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode());
    deviceUUID = deviceUuid.toString();    
}

お役に立てれば。

于 2010-12-09T21:20:18.303 に答える
0

エミュレータのバイナリをハックして別の値を入れても問題ありません。ただし、reference-ril.c では、値を読み取るために呼び出すため、10 進数で開始する必要がat_send_command_numeric()あります。at_send_command_singleline()MEID 文字列 (通常は「A」で始まる 14 桁の 16 進数) をサポートするには、これを変更する必要があると思います。あなたが非常に頭が良く、バイナリ内の関数アドレスを見つけて交換できる場合を除き、パッチを適用した後にソースからビルドして、一部の電話と同じ値を使用する必要があります。

于 2011-09-16T00:52:05.563 に答える