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 编号进行测试,并且希望为模拟器和真实设备保留相同的代码,则必须以某种方式在模拟器中更改它。

至少有两种方法可以做到这一点:

  1. 更改代码中的值并重新编译模拟器的代码。但是,这可能过于复杂和耗时...... :-)

  2. “破解”模拟器二进制文件(因为它既没有压缩也没有加密 - 你可以做到!)并在那里修改字符串(在正确的位置)。

这是如何做到的:

  • 备份模拟器二进制文件(回滚!稍后)。在 Windows 中,二进制文件可以在名称“emulator.exe”下找到,位于您的 android“\tools”文件夹中。

  • 用你最喜欢的十六进制编辑器打开二进制文件

  • 搜索+CGSN字符串后跟一个空字节(它应该跟 15 位 IMEI 号码 - 请参见下面的打印屏幕)

替代文字

  • 编辑数字(注意不要更改原始数字)

  • 并保存文件!

  • 并且可能更改/调整您的代码以使用 IMEI 作为您的 ID(如所Falmari指出的那样),或者使用此技巧来更改其他一些值。

于 2010-12-09T22:02:32.447 回答
3

如果你想要非空的模拟器 uuid,然后像这样启动模拟器:

emulator -avd jbx86 -prop emu.uuid=5ec33f90-a471-11e2-9e96-0800200c9a66
于 2013-04-13T19:38:44.827 回答
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 中,它调用at_send_command_numeric()读取值。我认为必须将其更改为at_send_command_singleline()支持 MEID 字符串(通常是 14 个以“A”开头的十六进制数字)。除非您真的很聪明并且可以在二进制文件中找到并交换函数地址,否则您必须在修补后从源代码构建以使用某些手机具有的相同值。

于 2011-09-16T00:52:05.563 回答