谈到唯一的Android ID,我相信每个人都看过这个,但是我也在努力想出一种解决方案来唯一地识别任何Android设备。我很乐意使用公开发布的类,但我还没有找到一个。
在我的情况下,要求能够唯一地识别任何具有某种形式的互联网连接(如GPRS或Wi-Fi)并运行于API级别8(v2.2 Froyo)的设备。我不知道是否有任何没有Wi-Fi或SIM卡的设备,如果有,请告诉我!
我们通过使用Wi-Fi mac地址的哈希值来解决iOS中的这个问题,因为所有iOS设备应该都有这个。然而对于Android,技术方法(例如上面提到的SO帖子中的答案)涉及到可以返回
所以我组合了这个来生成一个希望唯一的GUID: [此方法尚未完成!]
因此,您可能会发现
在我的情况下,要求能够唯一地识别任何具有某种形式的互联网连接(如GPRS或Wi-Fi)并运行于API级别8(v2.2 Froyo)的设备。我不知道是否有任何没有Wi-Fi或SIM卡的设备,如果有,请告诉我!
我们通过使用Wi-Fi mac地址的哈希值来解决iOS中的这个问题,因为所有iOS设备应该都有这个。然而对于Android,技术方法(例如上面提到的SO帖子中的答案)涉及到可以返回
null
的TelephonyManager
类(例如当设备没有SIM连接时,如Nexus 7),或者getContext().getContentResolver(),Secure.ANDROID_ID
,根据这里,在Froyo之前的版本上并不完全可靠(这对我来说是幸运的)。但它没有说明在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
和androidIDString
不可用,我需要确定是否会抛出异常。
那么... 这是否有些过度了?如果是这样,只使用context.getContentResolver(),android.provider.Settings.Secure.ANDROID_ID
是否安全?
null
,那么就不支持该设备。您认为在 Froyo 上使用Secure.ANDROID_ID
是安全的吗?此外,我认为经过 Root 的设备并不是一个主要的问题。我猜这会允许某个人伪造别人的不同设备,至少如果他们知道自己在做什么的话,但我认为通过添加一个密钥(在我有stringBuilder.append("someRandomData");
的地方)会使得生成最终返回的设备 ID 变得困难。 - ingh.amString regId= GoogleCloudMessaging.getInstance(context) = gcm.register(SENDER_ID);
它不是UUID,但它对于你的应用程序是唯一的。 - Raúl Juárez