web-dev-qa-db-ja.com

Androidエミュレータのデバイス識別子

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

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

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

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

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

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

27
hpique

エミュレーターでは、IMEIとIMSIの値は hardcoded です。

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

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

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

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

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

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

これを行う方法は次のとおりです:

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

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

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

alt text

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

  • そしてファイルを保存してください!

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

39
StanislavK

Null以外のエミュレータuuidが必要な場合は、次のようにエミュレータを起動します。

emulator -avd jbx86 -prop emu.uuid=5ec33f90-a471-11e2-9e96-0800200c9a66
2
Scott Evernden

Falmarriが言うように、エミュレータではデバイスIDは0になります。この方法を使用して、パラメーターの組み合わせに基づいて一意のデバイスIDを生成します(十分にテストしていませんが、エミュレーターとHTCの欲望で動作します)-これは私の方法ではありません(覚えていません私がそれを掘ったところ-それが原因である帰属)

/*
 * 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();    
}

お役に立てれば。

2
John J Smith

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

0
user947962