设备Id:
手机的唯一标识符,属于比较稳定的设备标识符。
缺陷:
非手机设备没有
6.0以后需要权限,需要用户手动确认。
在一些设备制造商的设备商,这个值不准备
Mac Address
通过检索设备的wifi或蓝牙硬件获取设备的Mac地址
缺陷
硬件限制:并不是所有的设备都有wifi和蓝牙硬件
权限问题:需要wifistate权限和bluetooth权限
系统限制:为了保护隐私,从android 6.0将不能获取到wifi和蓝牙有效的Mac地址
序列号
从Android2.3开始,可以获取设备的硬件序列号
Sim Serial Number
获取SIM卡的序列号
缺陷
设备限制:仅装有sim的设备才能获取到
权限问题:调用该方法需要read_phone_state权限
Bug;对cdma设备,返回的是一个空值
Android_Id
设备第一次启动时产生和存储的64-bit字符串
缺陷:
恢复出厂后可能会重置该值
部分设备由于制造商错误实现,导致会返回相同的Android_id
在Android4.2及以上,设备启动多用户功能后,每个用户的Android_id不相同
UUID
全局唯一标识符,是指在一台机器生成的数字,它保证对同一时空中的所有机器都是唯一的。
缺陷:
无法做到设备唯一
//获取设备id
public static synchronized String getDeviceID() {
String deviceId = PreferenceUtils.getDeviceId();
if (!TextUtils.isEmpty(deviceId)) {
return deviceId;
}
String serial = serialNumber();
String sep = "\t";
if (serial == null) {
serial = "";
}
serial = serial.trim();
deviceId = MD5.hexdigest(androidID() + sep + serial);
if (!TextUtils.isEmpty(deviceId)) {
PreferenceUtils.saveDeviceId(deviceId);
}
return deviceId;
}
//获取Androidid
private static String androidID() {
return Settings.Secure.getString(AppProfile.getContext().getContentResolver(), Settings.Secure.ANDROID_ID);
}
//获取序列号
private static String serialNumber() {
return android.os.Build.SERIAL;
}
//获取手机imei
private static String getPhoneIMEI(Context context) {
TelephonyManager mTelephonyMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
String imei = mTelephonyMgr.getDeviceId();
return imei;
}
//获取mac地址
private static String getWifiMacAddress(Context context) {
try {
WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
WifiInfo info = wifi.getConnectionInfo();//Caused by: java.lang.NullPointerException: name == null
return info.getMacAddress();
} catch (NullPointerException e) {
return null;
}
}