2010-12-09 198 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