Подтвердить что ты не робот

Идентификатор устройства для эмулятора Android

Я хочу протестировать в эмуляторе приложение, которое зависит от идентификатора устройства (ANDROID_ID).

В настоящее время я получаю идентификатор устройства со следующим кодом:

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

Когда я запускаю это в эмуляторе, он возвращает null, что дает мне всевозможные проблемы. Похоже, что более высокие версии Android возвращают что-то.

Есть ли способ получить идентификатор устройства в эмуляторе Android? Я ошибочно получаю идентификатор устройства?

Возможно ли установить идентификатор устройства эмулятора через консоль?

4b9b3361

Ответ 1

В эмуляторе значения IMEI и IMSI hardcoded:

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

поэтому вы всегда получите null.

Если вы все еще хотите использовать эти идентификационные номера для своего тестирования, и хотите сохранить один и тот же код для эмулятора и реального устройства, вы должны каким-то образом изменить его в эмуляторе.

Есть как минимум два способа сделать это:

  • Измените значения в коде и перекомпилируйте код для эмулятора. Однако это может быть слишком сложным и трудоемким...: -)

  • "Взломайте" двоичный файл эмулятора (поскольку он не сжат или не зашифрован - вы можете это сделать!) и изменить строки (в нужном месте) прямо там.

Здесь, как это сделать:

  • резервное копирование двоичного файла эмулятора (для отката! позже). В Windows двоичный файл можно найти под именем "emulator.exe", расположенным в вашей папке "\ tools" для Android.

  • открыть двоичный файл с вашим любимым шестнадцатеричным редактором

  • найдите строку + CGSN, за которой следует нулевой байт (за ней должны следовать 15 цифр номера IMEI - см. ниже экран печати)

alt text

  • отредактируйте номер (будьте осторожны, чтобы не менять исходное число цифр)

  • и сохраните файл!

  • и, возможно, измените/настройте свой код, чтобы использовать IMEI для своего идентификатора (как указано Falmari), или используйте этот трюк, чтобы изменить некоторые другие значения.

Ответ 2

Как говорит Фальмарри, идентификатор устройства будет 0 в эмуляторе. Я использую этот метод для создания уникального идентификатора устройства на основе комбинации параметров (он работает для меня, хотя я не тестировал его экстенсивно - эмулятор и 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();    
}

Надеюсь, что это поможет.

Ответ 3

Если вам нужен ненулевой эмулятор uuid, тогда запустите эмулятор следующим образом:

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

Ответ 4

Хорошо, чтобы взломать двоичный файл эмулятора, чтобы добавить альтернативное значение. Однако он должен начинаться с десятичной цифры, потому что в reference-ril.c он вызывает at_send_command_numeric() для чтения значения. Я считаю, что это нужно изменить на at_send_command_singleline() для поддержки строк MEID (обычно это 14 шестнадцатеричных цифр, начинающихся с "A" ). Если вы действительно не умны и можете найти и поменять адреса функций в двоичном формате, вам придется строить из источника после его исправления, чтобы использовать то же значение, что и у некоторых телефонов.