Android模拟器的设备标识符

29

我想在模拟器中测试一个依赖设备标识符(ANDROID_ID)的应用程序。

我目前使用以下代码获取设备标识符:

final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
当我在模拟器中运行此代码时,它返回null,这给我带来了各种问题。似乎在较高版本的Android上会返回其他内容。
在Android模拟器中是否有获取设备标识符的方法?我是否错误地获取了设备ID?
也许可以通过控制台设置模拟器的设备标识符?

1
此外,模拟器的设备ID将全部为“0”。 - Falmarri
我的Android 4.3 x86模拟器现在返回一个ANDROID_ID(287a676592dc7b0d)。 - Rupert Rawnsley
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. “黑客”模拟器二进制文件(因为它既没有压缩也没有加密-您可以这样做!)并在正确的位置修改字符串。
以下是如何执行此操作的步骤:
1. 备份模拟器二进制文件(稍后可以回滚!)。在Windows中,该二进制文件可以在android“\tools”文件夹下找到,名称为“emulator.exe”。 2. 使用您喜欢的十六进制编辑器打开该二进制文件。 3. 搜索跟随空字节的+CGSN字符串(应该跟随15位IMEI号码-请参见下面的屏幕截图)。

alt text

  • 编辑数字(注意不要改变原始数字的位数)

  • 保存文件!

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


我认为那个不再起作用了。我在emulator.exe中找不到"+CGSN"或"+CIMI"的值。 - lamwaiman1988
2
它仍然可以工作!你只需要查看emulator-arm.exe(或者如果你使用英特尔平台,则为emulator-x86.exe)。 - MM.
我真的不知道为什么这个答案被接受为正确答案。ANDROID_ID与IMEI / IMSI完全没有任何关系。 请参见https://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID - ThemBones
更改 IMEI 的方法已经过时,请添加更新的更改 IMEI 号码的方法。 - Jagjeet Singh

3
如果您想要一个非空的模拟器UUID,则需要以以下方式启动模拟器:
emulator -avd jbx86 -prop emu.uuid=5ec33f90-a471-11e2-9e96-0800200c9a66

4
这对我没有任何帮助。 - jab
应该是QEMU而不是EMU,对吗? - matthias_buehlmann

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

希望这能帮到您。

0

修改模拟器二进制文件并输入替代值是可以的。但是,这个值必须以十进制数字开头,因为在 reference-ril.c 中会调用 at_send_command_numeric() 来读取这个值。我认为需要将其改为 at_send_command_singleline() 以支持 MEID 字符串(通常是以'A' 开头的14位十六进制数字)。除非你真的很聪明,能够找到并交换二进制文件中的函数地址,否则你就必须从源代码构建,并在打了补丁后使用与某些手机相同的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接