Android设备唯一标识符的获取,适配Android10
一、背景
安卓10以后对不可重置的设备标识符实施了限制,第三方应用将无法得到这些标识符。
安卓10更新说明文档链接:https://developer.android.google.cn/about/versions/10/privacy/changes
二、常见的替代方案
1.Mac地址
1.1.安卓6.0以下需要ACCESS_WIFI_STATE
权限,通过以下方式获取:
WifiManager manager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); if (manager != null) { MacAddress = manager.getConnectionInfo().getMacAddress(); }
1.2.安卓版本大于6.0小于10的设备可以通过扫描所有网络接口来获取:
public static String getMacAddress() throws SocketException { String address = null; // 把当前机器上的访问网络接口的存入 Enumeration集合中 Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces(); while (interfaces.hasMoreElements()) { NetworkInterface netWork = interfaces.nextElement(); // 如果存在硬件地址并可以使用给定的当前权限访问,则返回该硬件地址(通常是 MAC)。 byte[] by = netWork.getHardwareAddress(); if (by == null || by.length == 0) { continue; } StringBuilder builder = new StringBuilder(); for (byte b : by) { builder.append(String.format("%02X:", b)); } if (builder.length() > 0) { builder.deleteCharAt(builder.length() - 1); } String mac = builder.toString(); Log.d("mac", "interfaceName=" + netWork.getName() + ", mac=" + mac); // 从路由器上在线设备的MAC地址列表,可以印证设备Wifi的 name 是 wlan0 if (netWork.getName().equals("wlan0")) { Log.d("mac", " interfaceName =" + netWork.getName() + ", mac=" + mac); address = mac; } } return address; }
1.3 Android 10 或更高版本的设备上,系统可以传输随机分配的 MAC 地址
华为、小米等手机上可以设置mac地址是否随机
在小米手机上,当链接WiFi时,会显示使用的mac,你可以在所连接的WiFi详情(图一箭头)里选择随机或者设备默认mac。mac相当于手机网卡身份证,具有唯一性,随机mac可防止WiFi探针,保护小米用户的隐私。
2.ANDROID_ID
android_id是设备的系统首次启动生成的一串字符,基本可以保证唯一性,获取方式:
public static String getAndroidID() { String id = Settings.Secure.getString(YxApplication.getInstance().getContentResolver(),Settings.Secure.ANDROID_ID); return id == null ? "" : id; }
与上面的几种相比,android_id获取比较简单,没有权限限制,也不会抛出异常,但是root、刷机或恢复出厂设置都会导致设备的ANDROID_ID重置。
但是安卓8.0以后不同的签名的应用会返回不一样的andro_id
安卓8.0变更说明文档链接:https://developer.android.google.cn/about/versions/oreo/android-8.0-changes
3.使用移动安全联盟的oaid
移动智能终端补充设备标识体系统一调用 SDK 由中国信息通信研究院泰尔
终端实验室、移动安全联盟整合提供,覆盖范围如下。
使用 oaid需接入第三方的sdk,调用他们的接口就可以得到oaid
oaid是系统首次启动后生成,可通过恢复出厂设置,或是系统上提供的重置功能重置。目前小米系统是支持重置的。
三、总结
总的来说安卓10以后android_id和oaid都可以做为唯一标识符使用。
本文地址:https://blog.csdn.net/a981814480/article/details/108727460