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

Java 如何获取WiFi网络接口的MAC地址?,java,android,linux,macos,networking,Java,Android,Linux,Macos,Networking,android的java.net.NetworkInterface实现似乎没有 byte[]getHardwareAddress()方法 我发现有几个论坛的人试图这样做,但没有明确的答案,我需要一个跨设备的UUID,所以我不能依赖电话号码或ANDROID_ID(这可以被覆盖,我认为这取决于用户是否拥有google帐户) 在linux中,您可以使用ifconfig或从/proc/net/arp读取,并且可以轻松获得硬件地址 安卓系统中有我可以读取的文件吗 必须有办法获取此地址,因为它显示在手机

android的java.net.NetworkInterface实现似乎没有 byte[]getHardwareAddress()方法

我发现有几个论坛的人试图这样做,但没有明确的答案,我需要一个跨设备的UUID,所以我不能依赖电话号码或ANDROID_ID(这可以被覆盖,我认为这取决于用户是否拥有google帐户)

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

安卓系统中有我可以读取的文件吗

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

一定有办法做到这一点 地址,因为它显示在 手机的“设置>关于手机>状态” 电话

这意味着,如果没有别的,你可以在安卓开源代码中四处寻找,也许可以使用谷歌代码搜索,找出它的来源


我自己做了一点尝试,似乎它正在使用
WifiInfo
中的
getMacAddress()

延迟回答,但它可以帮助其他人解决同样的“问题”

问题其实很简单:

WifiManager wifiMan = (WifiManager) this.getSystemService(
                Context.WIFI_SERVICE);
WifiInfo wifiInf = wifiMan.getConnectionInfo();
String macAddr = wifiInf.getMacAddress();
以上代码将为您获取设备的MAC地址,请记住在获取该地址时启用wifi。此代码段应在您的活动中使用。

更新:


从Android 6.0开始,上述API将为所有设备提供恒定的MAC地址,即02:00:00:00:00。有关详细信息,请参阅下面的

找到另一篇声称在6.0中查找MAC地址的帖子,尽管添加了以下权限,但未对其进行测试

 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
使用以下函数

 public void WI-FI_MAC() {
    WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
    String macAddress = wifiInfo.getMacAddress();
    }

在安卓Q上,再也无法访问mac地址了

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


WifiConfiguration.getRandomizedMacAddress()
将不再可用。

这是我的代码,在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 "";
}
公共静态字符串getMacAddress(){
试一试{
List all=Collections.List(NetworkInterface.getNetworkInterfaces());
用于(网络接口nif:all){
如果(!nif.getName().equalsIgnoreCase(“wlan0”))继续;
byte[]macBytes=nif.getHardwareAddress();
if(macBytes==null){
返回“”;
}
StringBuilder res1=新的StringBuilder();
用于(字节b:macBytes){
//res1.append(Integer.toHexString(b&0xFF)+“:”;
追加(String.format(“%02X:”,b));
}
如果(res1.length()>0){
res1.deleteCharAt(res1.length()-1);
}
返回res1.toString();
}
}捕获(例外情况除外){
//处理异常
}
返回“”;
}

只需添加一些细节,您就必须向androidManifest.xml添加适当的权限才能使其工作:不必启用wifi来获取MAC地址。我在wifi关闭的情况下获取。该代码可以在此处找到我在此处发布的工作解决方案此返回与适配器相同的地址(
02:00:00:00:00
)这是安卓6.0中引入的限制。我使用该解决方案从安卓6的物理手机上获取自己的mac地址,7和8这两个版本都很好用,从中获得我自己的mac地址的解决方案在Android 10模拟器上也很好用
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 "";
}