2011-04-04 60 views
0

前一段時間,我一直在尋找一種方法來唯一標識我的應用程序正在運行的設備。我發現下面的算法:電話唯一標識符差異

final TelephonyManager tm = (TelephonyManager) baseContext.getSystemService(Context.TELEPHONY_SERVICE); 

final String tmDevice = "" + tm.getDeviceId(); 
final String tmSerial = "" + tm.getSimSerialNumber(); 
final String androidId = "" + android.provider.Settings.Secure.getString(baseContext.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); 

UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); 
return deviceUuid.toString(); 

誰能給我解釋一下爲什麼會偶爾給我在同一設備上不同的結果,而我能做些什麼來糾正呢?

+0

請記住,許多Android設備沒有SIM卡!例如谷歌電視,很多平板電腦,媒體播放器等 – 2011-04-04 18:22:18

+0

這很好。這部分最終會變成空的。我問的是爲什麼同樣的設備會突然產生不同的結果。 – Andrew 2011-04-04 18:33:30

+0

可能這不是對這個問題的回答,但谷歌最近發佈了具有唯一標識符的準則,而不是使用getDeviceId方法。你可以在這裏看看它:http://android-developers.blogspot.com/2011/03/identifying-app-installations.html – advantej 2011-04-04 19:01:31

回答

0

我認爲問題與getSimSerialNumber()有關,因爲它會獲取某個特定SIM卡的序列號,所以如果電話的所有者更改了SIM(例如通過移動網絡),該方法將返回一個不同的ID。 SIM卡是唯一的,但每個設備可能在不同的時間使用不同的SIM卡。

+0

是的,我可以看到這將是一個問題。這不是我遇到的問題,因爲我的設備的SIM卡沒有交換過,但您確實說得很好。你能想到其他可能的原因嗎? – Andrew 2011-04-04 18:40:15

+0

文檔說ANDROID_ID「應該」在設備的使用壽命中保持不變,所以這將是我的第二個目標。 DeviceId通常是IMEI,不會改變。我想知道如果手機ius硬件重置或閃爍,ANDROID_ID會改變。這種方法對我來說似乎有點過分,我不確定爲什麼它比只使用IMEI號碼或同等號碼更好,但也許有一些類型的手機不是唯一的。 – 2011-04-04 19:04:32

+0

有趣...我不知道如果升級一個Android版本可能會導致這種情況發生。你怎麼看?我的意思是,誰知道三星或摩托羅拉或任何人對他們對Android的改動做了些什麼。也許他們出於某種原因更新(如果可以的話)Android ID? – Andrew 2011-04-04 21:35:44