在谈到唯一的 Android ID 时,我相信每个人都已经看到了这一点,但是我也在尝试提出一个解决方案来唯一地识别任何 Android 设备。我很乐意使用公开发布的课程,但我还没有找到。
在我的情况下,要求是能够唯一识别任何具有某种形式的互联网连接(例如 GPRS 或 Wi-Fi)并在 API 级别 8(v2.2 Froyo)上运行的设备。我不知道任何没有 Wi-Fi 或 SIM 卡的设备,所以如果有的话请告诉我!
我们在 iOS 中通过使用 Wi-Fi mac 地址的哈希解决了这个问题,因为所有 iOS 设备都应该有这个。但是对于 Android,技术(例如上面引用的 SO 帖子的答案)是指TelephonyManager
可以返回的类null
(例如当设备没有 SIM 连接时,例如 Nexus 7)或者getContext().getContentResolver(), Secure.ANDROID_ID
根据这里是在 Froyo 之前的版本上不是 100% 可靠的(这对我来说是幸运的)。然而,它并没有说明 Froyo 之后的任何问题,所以如果有任何问题,请告诉我!我也读过这个可以返回null
。根据这里它可以在恢复出厂设置时改变,但这不是一个主要问题。
所以我把它放在一起来生成一个希望唯一的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
显然,如果AND不可用,我将需要解决androidIDString
并在那里抛出异常。
所以……这是不是矫枉过正?如果是这样,只使用它是否安全context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID
?