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

Posted

技术标签:

【中文标题】如何获取WiFi网络接口的MAC地址?【英文标题】:How to obtain MAC address of WiFi network interface? 【发布时间】:2011-02-05 18:22:20 【问题描述】:

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 中是否有我可以读取的文件?

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

【问题讨论】:

我在这里发布了工作解决方案***.com/a/47789324/5330408 【参考方案1】:

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

answer 非常直接:

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

上面的代码会得到你设备的MAC地址,抓取地址时记得开启wifi。此代码 sn-p 应在您的 Activity 中使用。

【讨论】:

只是为了添加一些细节,您必须向 androidManifest.xml 添加适当的权限才能使其工作: 不需要启用 wifi 来获取 MAC 地址。我可以在关闭 wifi 的情况下使用它。【参考方案2】:

必须有办法得到这个 地址,因为它显示在 “设置 > 关于手机 > 状态”的 电话。

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

我自己做了一些推敲,看起来它正在使用来自WifiInfogetMacAddress()

【讨论】:

该代码可以在这里找到github.com/android/platform_packages_apps_settings/blob/master/…【参考方案3】:

更新: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 地址,但未测试过How to get Wi-Fi Mac address in Android Marshmallow

【讨论】:

我使用解决方案在 Android 6、7 和 8 的物理手机上从 ***.com/questions/33103798/… 获取我自己的 mac 地址,并且它可以正常工作【参考方案4】:

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

WifiInfo.getMacAddress() 将始终返回 02:00:00:00:00:00

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

【讨论】:

【参考方案5】:

添加以下权限。

 <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();
    

【讨论】:

这将返回与适配器相同的地址 (02:00:00:00:00:00) 这是Android 6.0引入的限制【参考方案6】:

这是我的代码,在 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 "";

【讨论】:

重复***.com/a/35830358/2826147

以上是关于如何获取WiFi网络接口的MAC地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取Android系统的wifi MAC和有线MAC

libpcap:如何获取活动网络接口(Mac OSX)

如何确定实际物理网卡的 MAC 地址——不是由 *** (.NET C#) 创建的虚拟网络接口

获取android以太网MAC地址(不是wifi接口)

绕过MAC地址认证接入目标网络

从已知的MAC地址获取网络接口卡(NIC)(并获取该NIC上的IP地址)