Android模拟器的设备标识符

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

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

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

当我在模拟器中运行它时,它返回null ,这给我所有的问题。 看来,更高的Android版本,它返回的东西。

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

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

Solutions Collecting From Web of "Android模拟器的设备标识符"

在仿真器中,IMEI和IMSI的值是硬编码的 :

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

因此,你将永远得到null

如果你仍然想使用这些ID号码进行testing,并且想要保留模拟器和真实设备的相同代码,则必须以某种方式在模拟器中对其进行更改。

至less有两种方法如何做到这一点:

  1. 更改代码中的值并重新编译模拟器的代码。 但是,这可能太复杂和费时… 🙂

  2. “模仿”二进制文件(因为它既不压缩也不encryption – 你可以做到!),并在那里修改string(在正确的位置)。

以下是如何做到这一点:

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

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

  • search+ CGSNstring后跟一个空字节(后面跟着IMEI号码的15个数字 – 请参阅下面的打印屏幕)

替代文字

  • 编辑号码(注意不要改变原来的位数)

  • 并保存文件!

  • 也许改变/调整你的代码使用IMEI为您的id(如Falmari指出),或使用这个技巧来改变一些其他的价值观。

如Falmarri所说,模拟器中的设备ID将为0。 我使用这种方法来生成一个基于参数组合的独特的设备ID(它似乎对我来说虽然我没有广泛的testing它 – 模拟器和HTC Desire) – 这不是我的方法(我不记得了在哪里我挖 – 但归属的地方)

 /* * Creates a UUID specific to the device. There are possibly some instances where this does * not work eg 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(); } 

希望这可以帮助。

如果你想要非null模拟器的uuid,那么启动模拟器是这样的:

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

将模拟器二进制文件转换为备用值是很好的。 但是,它必须以十进制数字开头,因为在reference-ril.c中,它调用at_send_command_numeric()来读取值。 我相信必须改为at_send_command_singleline()来支持MEIDstring(通常是以'A'开头的十四进制数字)。 除非你真的很聪明,并且可以在二进制文件中find并交换函数地址,否则在修补它之后,必须从源代码构build,以便使用与某些手机相同的值。