2010-12-09 169 views
24

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

我目前得到下面的代码设备标识符:

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

当我返回null仿真器,这给了我所有样的问题运行此。看起来更高的Android版本会返回一些东西。

有没有办法在Android模拟器中获取设备标识符?我是否错误地获取设备ID?

也许有可能通过控制台设置模拟器的设备标识符?

+1

此外,仿真器的设备ID将所有`0`的 – Falmarri 2010-12-09 19:40:50

+0

我的Android 4.3 x86模拟器现在返回一个ANDROID_ID(287a676592dc7b0d)。 – 2013-10-11 10:03:20

回答

39

在模拟器中,IMEI和IMSI的值hardcoded

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串后跟一个空字节搜索(它应遵循的IMEI号码的15位数字 - 见下面的PRINTSCREEN)

alt text

  • 编辑的数量(是车eful不改变原来的位数)

  • 并保存文件!

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

+0

我认为这行不通。我无法在emulator.exe中找到“+ CGSN”或“+ CIMI”的值。 – lamwaiman1988 2012-09-11 06:23:10

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位十六进制数字)。除非你非常聪明,并且可以在二进制文件中查找和交换函数地址,否则必须在修补它之后从源代码构建,以便使用某些手机具有的相同值。

2

如果你想非空模拟器UUID,然后开始喜欢这个模拟器:

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