是否存在唯一的Android设备ID?
更新:截至最近的Android版本,许多与ANDROID_ID
有关的问题已经得到解决,我认为这种方法不再必要。请查看Anthony的答案。
完全披露:我的应用程序最初使用下面的方法,但现在不再使用这种方法,我们现在使用Android Developer Blog中概述的方法,emmby的答案中提到(即生成和保存一个UUID#randomUUID()
)。
有许多关于此问题的答案,其中大部分只有“有时”有效,不幸的是,这还不够好。
根据我对设备进行的测试(所有手机都进行了测试,至少其中一个未激活)
- 所有测试的设备都返回
TelephonyManager.getDeviceId()
的值 - 所有GSM设备(所有测试都带有SIM卡)都返回
TelephonyManager.getSimSerialNumber()
的值 - 所有CDMA设备返回
getSimSerialNumber()
的null(如预期) - 添加Google帐户的所有设备都返回
ANDROID_ID
的值 - 所有CDMA设备(只要在设置期间添加了谷歌帐户)都返回相同的值(或者相同值的派生值)
ANDROID_ID
和TelephonyManager.getDeviceId()
。 - 我还没有测试无SIM卡的GSM设备、没有添加Google帐户的GSM设备或飞行模式下的任何设备。
因此,如果您想要一些独特的设备本身的内容,TM.getDeviceId()
应该足够了。显然,一些用户比其他用户更偏执,因此对一个或多个这些标识符进行哈希处理可能是有用的,以便该字符串仍然对设备几乎是唯一的,但不明确地标识用户的实际设备。例如,使用String.hashCode()
和UUID组合:
final TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE); final String tmDevice, tmSerial, androidId; tmDevice = "" + tm.getDeviceId(); tmSerial = "" + tm.getSimSerialNumber(); androidId = "" + android.provider.Settings.Secure.getString(getContentResolver(), android.provider.Settings.Secure.ANDROID_ID); UUID deviceUuid = new UUID(androidId.hashCode(), ((long)tmDevice.hashCode() << 32) | tmSerial.hashCode()); String deviceId = deviceUuid.toString();
可能会得到类似如下的结果:00000000-54b3-e7c7-0000-000046bffd97
对我来说已经足够好了。
正如Richard在下面提到的,别忘了你需要读取TelephonyManager
属性的许可,所以将其添加到你的清单中:
导入库
import android.content.Context; import android.telephony.TelephonyManager; import android.view.View;
Settings.Secure#ANDROID_ID
返回 Android ID,以 64 位十六进制字符串的形式作为每个用户的唯一标识符。
import android.provider.Settings.Secure; private String android_id = Secure.getString(getContext().getContentResolver(), Secure.ANDROID_ID);
此外,还应阅读唯一标识符的最佳实践:https://developer.android.com/training/articles/user-data-ids