當談論獨特的Android ID時,我確信每個人都看過this,但是我也試圖想出一個唯一標識任何Android設備的解決方案。我很樂意使用公開發布的課程,但我還沒有找到。創建一個全球唯一的Android標識符
在我的情況下,要求是能夠唯一標識任何具有某種形式的互聯網連接(如GPRS或Wi-Fi)並在API級別8(v2.2 Froyo)上運行的設備。我不知道任何沒有Wi-Fi或SIM卡的設備,因此請告訴我是否有任何設備!
我們在iOS中通過使用Wi-Fi mac地址的散列來解決了這個問題,因爲所有的iOS設備都應該有。然而,對於Android,技術(例如上面引用的SO帖子的答案)是指TelephonyManager
類,其可以返回null
(例如,當設備沒有SIM連接時,如Nexus7)或getContext().getContentResolver(), Secure.ANDROID_ID
,其根據到here在Froyo之前的版本(這對我來說是幸運的)不是100%可靠的。但是,如果有任何問題,請不要在Froyo之後提出任何問題,請告訴我!我也讀過這可以返回null
。根據here,它可以在出廠重置時更改,但這不是主要問題。
所以我把這個放在一起生成一個希望唯一的GUID: [這種方法不完整!]
public static String GetDeviceId(Context context)
{
// Custom String Hash 1
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("someRandomData"); // Not really needed, but means the stringBuilders value won't ever be null
// TM Device String
final TelephonyManager tm = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);
String tmDeviceId = tm.getDeviceId(); // Could well be set to null!
LogMsg.Tmp("TM Device String [" + tmDeviceId + "]");
// Custom String Hash 2
stringBuilder.append(tmDeviceId);
int customHash = stringBuilder.toString().hashCode();
LogMsg.Tmp("Custom String hash [" + customHash + "]");
// Device ID String
String androidIDString = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
LogMsg.Tmp("Device ID String [" + androidIDString + "]");
// Combined hashes as GUID
UUID deviceUuid = new UUID(androidIDString.hashCode(), ((long)customHash << 32));
LogMsg.Tmp("Combined hashes as GUID [" + deviceUuid.toString() + "]");
return deviceUuid.toString();
}
所以,你可能會發現tmDeviceId
被設置爲null
,在這種情況下,該customHash
將是相同的,不管設備,但隨後這與androidIDString
結合應該是全球唯一的。我認爲。很顯然,如果tmDeviceId
和androidIDString
不可用,並且在那裏拋出異常,我將需要解決。
所以......這是否過分矯枉過正?如果是這樣,僅使用context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID
安全嗎?
「在我的情況,要求是能夠唯一地識別任何設備」 - 如果你需要這個覆蓋植根設備的用戶,這是不可能的AFAIK。當然,您正在使用的任何部分都可以由具有root權限的人修改。 「我不知道任何沒有Wi-Fi或SIM卡的設備,所以請告訴我是否有任何設備!」 - Google TV設備可能沒有WiFi,只能使用以太網。如果您在Play商店之外進行分發,則可能會有其他設備沒有移動數據或WiFi。 – CommonsWare 2013-02-14 17:07:24
@CommonsWare感謝您的回覆。我最初的想法是,如果我在問題中討論的方法都返回null,則不支持該設備。你認爲在Froyo的任何東西上使用Secure.ANDROID_ID是安全的嗎?另外,我不認爲根植設備是一個主要問題。我猜這會讓別人欺騙別人的其他設備,至少,如果他們知道他們在做什麼,但我想通過添加一個鍵(我有'stringBuilder.append(「someRandomData」);'' )會使得難以生成最終返回的設備ID。 – 2013-02-15 09:36:55
「你認爲從Froyo的任何東西上使用Secure.ANDROID_ID是安全的嗎?」 - 固定的設備用戶可以更改它,而不合法擁有Play商店的設備可能沒有唯一的值。 – CommonsWare 2013-02-15 12:32:11