以编程方式获取Android设备的MAC


91

我需要使用Java获取我的android设备的MAC地址。我已经在网上搜索过,但没有发现任何有用的信息。





请检查此解决方案,它适用于我stackoverflow.com/questions/31329733/…–
Gorio

从android M开始不推荐使用该api,请立即使用:stackoverflow.com/questions/31329733/…–
Ehud

Answers:


114

正如评论中已经指出的那样,可以通过WifiManager接收MAC地址。

WifiManager manager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo info = manager.getConnectionInfo();
String address = info.getMacAddress();

也不要忘记在您的计算机中添加适当的权限 AndroidManifest.xml

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

请参考Android 6.0更改

为了向用户提供更好的数据保护,从此版本开始,Android删除使用Wi-Fi和Bluetooth API对应用程序对设备本地硬件标识符的编程访问。WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()方法现在返回常量值02:00:00:00:00:00。

要通过蓝牙和Wi-Fi扫描访问附近的外部设备的硬件标识符,您的应用现在必须具有ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION权限。


11
另外请注意,由于无法在设备上关闭wifi,有时无法提取mac地址
sbrichards

3
链接的博客还解释了如何以更通用的方式查找此MAC地址,这种方式不假定网络接口使用WiFi连接。
史蒂芬C

请记住使用上下文来调用getSystemService。
铁托·莱瓦

这非常适合使用Wifi的Android手机和平板电脑,但是我试图在可以使用Wifi或以太网的旧Gingerbread Android平板电脑上获取以太网MAC地址。关于如何检查以太网MAC地址有什么想法?谢谢。
赛斯

@sbrichards您所说的WiFi关闭是什么意思?
peterchaula '16

33

WifiInfo.getMacAddress()无法通过棉花糖及更高版本获取MAC地址,该地址已被禁用,并将返回的恒定值02:00:00:00:00:00


3
有什么选择?
山姆

2
@SameerThigale取决于您要实现的目标。这背后的想法是您可能不应该尝试获取MAC地址。
minipif

我不确定为什么,但是在链接的api文档中找不到弃用的注释。也许他们改变了主意?
DBX12'9

1
@ DBX12尽管未记录该方法本身,但未将其标记为已弃用。第二个链接指向有关它的正式说明。
minipif

24
public static String getMacAddr() {
    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(String.format("%02X:",b));
            }

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {
    }
    return "02:00:00:00:00:00";
}

2
在Android 7.1上,它一直显示“ 02:00:00:00:00:00”。
Android开发人员

它必须在物理设备上而不是仿真器或虚拟设备上进行测试
pm dubey 2013年

这种解决方法仍然有效吗?还是在操作系统方面修补/修复了它?
CasualT

1
仍然有效。不要忘记在清单文件中授予Internet权限。
下午dubey

1
它不再适用于Android棉花糖和更高版本,因为它将返回“ 02:00:00:00:00:00”的值
SweArmy

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

public String getMacAddress(Context context) {
    WifiManager wimanager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    String macAddress = wimanager.getConnectionInfo().getMacAddress();
    if (macAddress == null) {
        macAddress = "Device don't have mac address or wi-fi is disabled";
    }
    return macAddress;
}

有其他的方式在这里


macAddressnull吗?
Max Heiber

函数调用时需要将哪个参数作为上下文传递?
Donal的

@Donal是什么意思Context context?如果是,则任何上下文都应该起作用。developer.android.com/reference/android/content/…–
ademar111190

11

我从http://robinhenniges.com/en/android6-get-mac-address-programmatically建立了这个解决方案,它对我有用!希望有帮助!

public static String getMacAddr() {
    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) {
                String hex = Integer.toHexString(b & 0xFF);
                if (hex.length() == 1)
                    hex = "0".concat(hex);
                res1.append(hex.concat(":"));
            }

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {
    }
    return "";
}

我想这是因为我们需要删除最后一个“:”字符。此代码为2岁,可能itsn't的最佳方式做这件事,就应该对其进行优化
提香Bruschetta的

7

它与棉花糖一起工作

package com.keshav.fetchmacaddress;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Log.e("keshav","getMacAddr -> " +getMacAddr());
    }

    public static String getMacAddr() {
        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) + ":");
                }

                if (res1.length() > 0) {
                    res1.deleteCharAt(res1.length() - 1);
                }
                return res1.toString();
            }
        } catch (Exception ex) {
            //handle exception
        }
        return "";
    }
}

感谢Qadir Hussain
Keshav Gera,

3

您可以获取mac地址:

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiInfo wInfo = wifiManager.getConnectionInfo();
String mac = wInfo.getMacAddress();

在Menifest.xml中设置权限

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

问题是关于获取android设备的mac,而不是wifi路由器的mac。
hina abbasi

3

您无法再获取Android设备的硬件MAC地址。WifiInfo.getMacAddress()和BluetoothAdapter.getAddress()方法将返回02:00:00:00:00:00。此限制是在Android 6.0中引入的。

但是罗布·安德森(Rob Anderson)找到了一种解决方案,该解决方案适用于<棉花糖:https : //stackoverflow.com/a/35830358


2

从Android源采取这里。这是在系统的设置应用程序中显示您的MAC地址的实际代码。

private void refreshWifiInfo() {
    WifiInfo wifiInfo = mWifiManager.getConnectionInfo();

    Preference wifiMacAddressPref = findPreference(KEY_MAC_ADDRESS);
    String macAddress = wifiInfo == null ? null : wifiInfo.getMacAddress();
    wifiMacAddressPref.setSummary(!TextUtils.isEmpty(macAddress) ? macAddress
            : getActivity().getString(R.string.status_unavailable));

    Preference wifiIpAddressPref = findPreference(KEY_CURRENT_IP_ADDRESS);
    String ipAddress = Utils.getWifiIpAddresses(getActivity());
    wifiIpAddressPref.setSummary(ipAddress == null ?
            getActivity().getString(R.string.status_unavailable) : ipAddress);
}

我应该如何在非活动类或片段中访问它?
2015年

您将需要一个上下文来获取一个WifiManager(即WifiManager mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);)。
fernandohur

5
如果尝试此代码,则我获取的是02:00:00:00:00:00Mac地址,而不是实际的wifi上网Mac ID
2015年



-3

我想我只是找到了一种在没有LOCATION许可的情况下读取MAC地址的方法:运行ip link并解析其输出。(您可以通过查看此二进制文件的源代码来执行类似操作)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.