设备ID(DeviceId)
- 获取办法
android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String deviceId = tm.getDeviceId(); - 当设备为手机时,返回设备的唯一ID。手机制式为 GSM 时,返回手机的 IMEI 。手机制式为 CDMA 时,返回手机的 MEID 或 ESN 。
- 非电话设备或者 Device ID 不可用时,返回 null .
- 属于比较稳定的设备标识符。
- 需要
READ_PHONE_STATE
权限。 (Android 6.0 以上需要用户手动赋予该权限)。 - 某些设备上该方法存在 Bug ,返回的结果可能是一串0或者一串*号。
Sim 序列号(Sim Serial Number)
- 获取办法
android.telephony.TelephonyManager tm = (android.telephony.TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String simSerialNum = tm.getSimSerialNumber(); - 不同 Sim 卡的序列号不同.
- Sim 卡序列号,当手机上装有 Sim 卡并且可用时,返回该值。手机未装 Sim 卡或者不可用时,返回
null
. - 需要
READ_PHONE_STATE
权限。 (Android 6.0 以上需要用户手动赋予该权限)
Mac 地址(Mac Address)
- 获取办法
android.net.wifi.WifiManager wifi = (android.net.wifi.WifiManager) context.getSystemService(Context.WIFI_SERVICE);
String macAddress = wifi.getConnectionInfo().getMacAddress(); - 没有 WiFi 硬件或者 WiFi 不可用的设备可能返回 null 或空,注意判空.
- 比较稳定的硬件标识符。
- 需要
ACCESS_WIFI_STATE
权限。
设备序列号(Serial Number, SN)
- 获取办法:
String serialNum = android.os.Build.SERIAL;
- 比较稳定的设备硬件标识符,谷歌也未提到有啥缺点。
ANDROID_ID
- 获取办法:
String androidId = android.provider.Settings.Secure.getString(context.getContentResolver(), android.provider.Settings.Secure.ANDROID_ID);
- 在设备第一次启动的时候生成并保存,并且可能会在恢复出厂设置后重置该值。理论上是大部分是重置的。(API 中原话是:The value
may
change if a factory reset is performed on the device.) - 在 Android 2.2 中不可靠.
- 部分设备由于制造商错误实现,导致会返回相同的 Android_ID.
- 在 Android 4.2 及以上, 设备启用多用户功能后,每个用户的 Android_ID 不相同.
参考:
[1].http://www.jianshu.com/p/b6f4b0aca6b0?utm_campaign=haruki
[2].http://*.com/questions/2785485/is-there-a-unique-android-device-id/2853253#2853253