如何获取WiFi网络接口的MAC地址?

IT小君   2022-01-09T05:00:43

看来android的java.net.NetworkInterface实现没有
byte[] getHardwareAddress()方法 http://developer.android.com/reference/java/net/NetworkInterface.html

我发现几个论坛的人试图这样做但没有明确的答案,我需要获得一个跨设备的 UUID,所以我不能依赖电话号码或 ANDROID_ID(可以被覆盖,我认为这取决于关于拥有谷歌帐户的用户) http://developer.android.com/reference/android/provider/Settings.Secure.html#ANDROID_ID

在 linux 中,您可以使用 ifconfig 或从 /proc/net/arp 读取,您可以轻松获取硬件地址。

android中是否有我可以读取的文件?

必须有一种方法可以获取此地址,因为它显示在手机的“设置 > 关于手机 > 状态”中。

评论(6)
IT小君

迟到的答案,但它可以帮助其他有同样“问题”的人。

回答实在是直截了当:

WifiManager wifiMan = (WifiManager) this.getSystemService(
                Context.WIFI_SERVICE);
WifiInfo wifiInf = wifiMan.getConnectionInfo();
String macAddr = wifiInf.getMacAddress();

上面的代码将为您获取设备的 MAC 地址,请记住在获取地址时启用 wifi。此代码段应在您的活动中使用。

2022-01-09T05:00:43   回复
IT小君

必须有一种方法可以获取此地址,因为它显示在手机的“设置 > 关于手机 > 状态”中。

这意味着,如果不出意外,您可以浏览 Android 开源代码,也许使用 Google 代码搜索,以找出它从哪里提取的。

自己做了一些推敲,看起来它正在使用getMacAddress()from WifiInfo

2022-01-09T05:00:44   回复
IT小君

更新:

Android 6.0开始,上面的 API 将为您提供所有设备的恒定 MAC 地址,即02:00:00:00:00:00有关详细信息,请参阅下文
http://developer.android.com/about/versions/marshmallow/android-6.0-changes.html
发现另一篇声称在 6.0 中找到 MAC 地址的帖子,但未测试
如何获取 Wi-Fi Mac Android Marshmallow 中的地址

2022-01-09T05:00:44   回复
IT小君

在 Android Q 上,无法再访问 mac 地址。

WifiInfo.getMacAddress()总会回来的02:00:00:00:00:00

并且WifiConfiguration.getRandomizedMacAddress()将不再可用。

2022-01-09T05:00:44   回复
IT小君

添加以下权限。

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

WifiManager 在 onCreate 中初始化。

 WifiManager wifiMgr = (WifiManager) getContext().getSystemService(context.WIFI_SERVICE);

使用以下功能。

 public void WI-FI_MAC() {
    WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
    String macAddress = wifiInfo.getMacAddress();
    }
2022-01-09T05:00:44   回复
IT小君

这是我的代码,在 android 5 + 中运行良好。

public static 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(Integer.toHexString(b & 0xFF) + ":");
                res1.append(String.format("%02X:",b));
            }
            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {
        //handle exception
    }
    return "";
}
2022-01-09T05:00:44   回复