Android 11 获取设备的 MAC 地址源码解析

在 Android 11 及更新的版本中,为了保护用户的隐私和安全,Google 已经移除了直接访问设备的 MAC 地址的能力。然而,有时候我们仍然需要获取设备的 MAC 地址来满足特定的需求。本文将介绍如何通过 Android 11 的新 API 获取设备的 MAC 地址。

前提条件

在使用新的 API 获取 MAC 地址之前,需要确保你的应用满足以下条件:

  1. 你的应用必须使用 targetSdkVersion 设置为 30 或更高的版本。
  2. 你必须在应用的 AndroidManifest.xml 文件中添加 READ_MAC_ADDRESS 权限:
<uses-permission android:name="android.permission.READ_MAC_ADDRESS" />

使用新的 API 获取 MAC 地址

在 Android 11 中,可以通过 WifiManager 的新方法 getFactoryMacAddress() 来获取设备的 MAC 地址。以下是一个使用该方法的示例代码:

WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
String macAddress = wifiManager.getFactoryMacAddress();

上述代码首先通过 getSystemService() 方法获取 WifiManager 的实例,然后调用 getFactoryMacAddress() 方法获取设备的 MAC 地址。请注意,getFactoryMacAddress() 方法返回的 MAC 地址可能为空或者返回一个伪造的随机地址。

兼容性处理

由于 Android 11 及更新的版本移除了直接访问设备的 MAC 地址的能力,因此在旧版本的 Android 上运行上述代码可能会报错。为了保证应用在不同的 Android 版本上兼容,可以通过以下方式进行处理:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    String macAddress = wifiManager.getFactoryMacAddress();
    if (macAddress == null) {
        // 处理 MAC 地址为空的情况
    } else {
        // 使用获取到的 MAC 地址
    }
} else {
    // 使用旧的方式获取 MAC 地址
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    WifiInfo wifiInfo = wifiManager.getConnectionInfo();
    String macAddress = wifiInfo.getMacAddress();
}

上述代码首先检查当前运行的 Android 版本是否大于等于 Android 10(即 Android Q)。如果是,则使用新的 API 获取 MAC 地址;如果不是,则使用旧的方式获取 MAC 地址。

结论

通过 Android 11 的新 API,我们可以在应用中获取设备的 MAC 地址。但是需要注意的是,由于隐私和安全方面的考虑,获取到的 MAC 地址可能为空或者返回一个伪造的随机地址。因此,在使用 MAC 地址的场景中,我们应该谨慎对待,并且在可能的情况下考虑使用其他的替代方案。

希望本文对你理解 Android 11 中获取设备的 MAC 地址的源码有所帮助!如果你有任何问题或者疑惑,欢迎留言讨论。


参考代码: [Android 11 获取 MAC 地址示例代码](

Android 11

journey
    title Android 11 获取 MAC 地址
    section 使用新的 API
    使用 WifiManager 的 getFactoryMacAddress() 方法获取设备的 MAC 地址
    
    section 兼容性处理
    根据 Android 版本选择使用新 API 或旧方式获取 MAC 地址

参考链接:

  • [Android Developers - WifiManager](
  • [Android Developers - READ_MAC_ADDRESS](