Идентификатор устройства для эмулятора Android
Я хочу протестировать в эмуляторе приложение, которое зависит от идентификатора устройства (ANDROID_ID).
В настоящее время я получаю идентификатор устройства со следующим кодом:
final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
Когда я запускаю это в эмуляторе, он возвращает null
, что дает мне всевозможные проблемы. Похоже, что более высокие версии Android возвращают что-то.
Есть ли способ получить идентификатор устройства в эмуляторе Android? Я ошибочно получаю идентификатор устройства?
Возможно ли установить идентификатор устройства эмулятора через консоль?
Ответы
Ответ 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" ). Если вы действительно не умны и можете найти и поменять адреса функций в двоичном формате, вам придется строить из источника после его исправления, чтобы использовать то же значение, что и у некоторых телефонов.