欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Android设备唯一标识符的获取,适配Android10

程序员文章站 2022-03-02 17:25:55
一、背景安卓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.getSys...

一、背景

安卓10以后对不可重置的设备标识符实施了限制,第三方应用将无法得到这些标识符。

安卓10更新说明文档链接:https://developer.android.google.cn/about/versions/10/privacy/changes

Android设备唯一标识符的获取,适配Android10

二、常见的替代方案

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探针,保护小米用户的隐私。

Android设备唯一标识符的获取,适配Android10

Android设备唯一标识符的获取,适配Android10

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

Android设备唯一标识符的获取,适配Android10

3.使用移动安全联盟的oaid

移动智能终端补充设备标识体系统一调用 SDK 由中国信息通信研究院泰尔
终端实验室、移动安全联盟整合提供,覆盖范围如下。
Android设备唯一标识符的获取,适配Android10

Android设备唯一标识符的获取,适配Android10

使用 oaid需接入第三方的sdk,调用他们的接口就可以得到oaid

oaid是系统首次启动后生成,可通过恢复出厂设置,或是系统上提供的重置功能重置。目前小米系统是支持重置的。

 

三、总结

总的来说安卓10以后android_id和oaid都可以做为唯一标识符使用。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本文地址:https://blog.csdn.net/a981814480/article/details/108727460