1、所有的设备都可以返回一个 TelephonyManager.getDeviceId()
2、所有的GSM设备 (测试设备都装载有SIM卡) 可以返回一个TelephonyManager.getSimSerialNumber()
3、所有的CDMA 设备对于 getSimSerialNumber()
却返回一个空值!
4、所有添加有谷歌账户的设备可以返回一个 ANDROID_ID
5、所有的CDMA设备对于 ANDROID_ID
和 TelephonyManager.getDeviceId()
返回相同的值(只要在设置时添加了谷歌账户)
所以如果你想得到设备的唯一序号, TelephonyManager.getDeviceId()
就足够了。但很明显暴露了DeviceID,实际上加密后的序号仍然可以唯一的识别该设备,并且不会明显的暴露用户的特定设备,例如,使用 String.hashCode() ,结合UUID:
final
TelephonyManager tm = (TelephonyManager) getBaseContext().getSystemService(Context.TELEPHONY_SERVICE);
final
String tmDevice, tmSerial, tmPhone, 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 uniqueId = deviceUuid.toString();