简单来说就是一串符号(或者数字)类似于我们的身份证号,映射现实中硬件设备。排除特殊情况(模拟器等),设备ID和设备是一一对应的,我们称之为“唯一设备ID(Unique Device Identifier)
关于设备ID的作用,大概可以分为下面几点:
下面我们简单介绍一下常用的设备ID及其获取方法
Android ID 是获取门槛最低的,不需要任何权限,64bit 的取值范围,唯一性算是很好的了。
但是不足之处也很明显:
1、刷机、root、恢复出厂设置等会使得 Android ID 改变;
2、Android 8.0之后,Android ID的规则发生了变化:
对于升级到8.0之前安装的应用,ANDROID_ID会保持不变。如果卸载后重新安装的话,ANDROID_ID将会改变。
对于安装在8.0系统的应用来说,ANDROID_ID根据应用签名和用户的不同而不同。ANDROID_ID的唯一决定于应用签名、用户和设备三者的组合。
两个规则导致的结果就是:
第一,如果用户安装APP设备是8.0以下,后来卸载了,升级到8.0之后又重装了应用,Android ID不一样;
第二,不同签名的APP,获取到的Android ID不一样。
其中第二点可能对于广告联盟之类的有所影响(如果彼此是用Android ID对比数据的话),所以Google文档中说“请使用Advertising ID”,
不过大家都知道,Google的服务在国内用不了。对Android ID做了约束,对隐私保护起到一定作用,并且用来做APP自己的活跃统计也还是没有问题的。
获取方法如下:
String android_id = Settings.System.getString(context.getContentResolver(), Settings.System.ANDROID_ID);
IMEI本该最理想的设备ID,具备唯一性,恢复出厂设置不会变化(真正的设备相关)。然而,获取IMEI需要 READ_PHONE_STATE 权限,估计大家也知道这个权限有多麻烦了。尤其是Android 6.0以后, 这类权限要动态申请,很多用户可能会选择拒绝授权。我们看到,有的APP不授权这个权限就无法使用, 这可能会降低用户对APP的好感度。
而且,Android 10.0 将彻底禁止第三方应用获取设备的IMEI, 即使申请了 READ_PHONE_STATE 权限。
所以,如果是新APP,不建议用IMEI作为设备标识;
如果已经用IMEI作为标识,要赶紧做兼容工作了,尤其是做新设备标识和IMEI的映射。
获取方法如下:
try {
TelephonyManager tm = (TelephonyManager)context.getSystemService(Service.TELEPHONY_SERVICE);
//如果双卡,获取第一张卡的
android_IMEI = tm.getDeviceId(0);
SharedPreferencesUtil.setPrefString(context, LxKeys.ID_IMEI, android_IMEI);
} catch (Exception e) {
e.printStackTrace();
}
获取MAC地址也是越来越困难了,
Android 6.0以后通过 WifiManager 获取到的mac将是固定的:02:00:00:00:00:00 ,
再后来连读取 /sys/class/net/wlan0/address 也获取不到了。
如今只剩下面这种方法可以获取(没有开启wifi也可以获取到):
public static String getWifiMac() {
try {
Enumeration<NetworkInterface> enumeration = NetworkInterface.getNetworkInterfaces();
if (enumeration == null) {
return "";
}
while (enumeration.hasMoreElements()) {
NetworkInterface netInterface = enumeration.nextElement();
if (netInterface.getName().equals("wlan0")) {
return formatMac(netInterface.getHardwareAddress());
}
}
} catch (Exception e) {
Log.e("tag", e.getMessage(), e);
}
return "";
}
简介:
因传统的移动终端设备标识如国际移动设备识别码(IMEI)等已被部分国家认定为用户隐私的一部分,并存在被篡改和冒用的风险,所以在Android 10及后续版本中非厂商系统应用将无法获取IMEI、MAC等设备信息。无法获取IMEI会在用户行为统计过程中对设备识别产生一定影响。
近日移动安全联盟针对该问题联合国内手机厂商推出补充设备标准体系方案,选择OAID字段作为IMEI等的替代字段。OAID字段是由中国信通院联合华为、小米、OPPO、VIVO等厂商共同推出的设备识别字段,具有一定的权威性,可满足用户行为统计的使用场景。(可能存在的问题:部分厂商还没有支持,不过随着更新版本,越来越多的手机已经纳入到兼容范围了)