我想在模拟器中测试一个取决于设备标识符(ANDROID_ID)的应用。
我目前使用以下代码获取设备标识符:
final String deviceID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
当我在模拟器中运行它时会返回null
,这会给我带来各种问题。似乎更高的Android版本会返回一些内容。
有没有办法在Android模拟器中获取设备标识符?我是否错误地获取了设备ID?
也许可以通过控制台设置模拟器的设备标识符?
答案 0 :(得分: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号用于测试,并且您希望为仿真器和真实设备保留相同的代码,则必须以某种方式在模拟器中更改它。
至少有两种方法:
更改代码中的值并重新编译模拟器的代码。但是,这可能太复杂而且耗时......: - )
“破解”模拟器二进制文件(因为它既不是压缩或加密的 - 你可以做到!)并在那里修改字符串(在正确的位置)。
以下是如何操作:
备份模拟器二进制文件(稍后回滚!)。在Windows中,二进制文件可以在名为“emulator.exe”的位置找到,位于android“\ tools”文件夹中。
使用您最喜欢的十六进制编辑器打开二进制文件
搜索 + CGSN 字符串,后跟空字节(后跟15位IMEI号码 - 请参阅下面的打印屏幕)
编辑号码(注意不要更改数字的原始号码)
并保存文件!
并且可能更改/调整您的代码以使用IMEI作为您的ID(如Falmari
指出),或使用此技巧更改其他一些值。
答案 1 :(得分: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();
}
希望这有帮助。
答案 2 :(得分:2)
如果你想要非空模拟器uuid,那么就像这样启动模拟器:
emulator -avd jbx86 -prop emu.uuid=5ec33f90-a471-11e2-9e96-0800200c9a66
答案 3 :(得分:0)
破解模拟器二进制文件以放入备用值是可以的。但是,它必须以十进制数字开头,因为在reference-ril.c中,它调用at_send_command_numeric()
来读取值。我认为必须更改为at_send_command_singleline()
以支持MEID字符串(通常是以“A”开头的14个十六进制数字)。除非你真的很聪明并且可以在二进制文件中找到并交换函数地址,否则你必须在修补它之后从源代码构建它以使用与某些手机相同的值。