以下亲测!
获取ANDROID_ID:
在设备首次启动时,系统会随机生成一个64位的数字,并把这个数字以16进制字符串的形式保存下来,这个16进制的字符串就是,但是当设备被wipe,ROOT,恢复出厂设置,后该值会被重置,
厂商定制系统的Bug:不同的设备可能会产生相同的ANDROID_ID:9774d56d682e549c。 (其他文章说,未测出,应该几率小)
厂商定制系统的Bug:有些设备返回的值为null。 (其他文章说,未测出,应该几率小)
看了很多文章都是用的:(注:小于API16实用,在api16中不会提示过期)
String ANDROID_ID = Settings.System.getString(getContentResolver(), Settings.System.ANDROID_ID);
api>17则提示废弃(Deprecated),可以使用下面方法:
String ANDROID_ID = Settings.System.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID);
Serial Number:
设备唯一序列号
很多文章使用String SerialNumber = android.os.Build.SERIAL; 进行获取,亲测小米8获取值为unknown,不敢用,哈哈
MAC地址:
概念:可以使用手机Wifi或蓝牙的MAC地址作为设备标识。
不足: 如果设备没有支持WIFI的硬件,就返回null;
Android 6.0(API23) 之前,获得Mac地址的通用方式
必须的权限 < uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
WifiManager wifiManager=(WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wifiInfo=wifiManager.getConnectionInfo();
String mac=wifiInfo.getMacAddress();
从6.0后,权限被拒绝,从网上找到了另一种方案,通过扫描各个网络接口来获取Mac地址,并且这种方式在Android 6.0上同样有效
网上说需要权限 < uses-permission android:name="android.permission.INTERNET" />
亲测,没有该权限也能获取。。。
public String getMacAddress() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface nif : all) {
if (!nif.getName().equalsIgnoreCase("wlan0")) continue;
byte[] macBytes = nif.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
for (byte b : macBytes) {
res1.append(String.format("%02X:",b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString();
}
} catch (Exception ex) {
}
return "02:00:00:00:00:00";
}
DEVICE_ID:
概念: 是区别移动设备的标志,储存在移动设备中,可用于监控被窃或无效的移动设备。
优点:
1.根据不同的手机设备返回IMEI,MEID或者ESN码,唯一性良好 。
不足:
1.非手机:如平板电脑,像这样设备没有通话的硬件功能,系统中也就没有TELEPHONY_SERVICE,自然也就无法获得DEVICE_ID;
2.权限问题:<uses-permission android:name="android.permission.READ_PHONE_STATE" />
3.厂商定制系统中的Bug:少数手机设备上,由于该实现有漏洞,会返回垃圾,如:00000000或者****
当设备为手机时,返回设备的唯一ID。手机制式为 GSM 时,返回手机的 IMEI 。手机制式为 CDMA 时,返回手机的 MEID 或 ESN 。
public String getDeviceId(){
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) {
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
return tm.getDeviceId();
}
}
else{
final TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
return tm.getDeviceId();
}
return null;
}