You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 11及更高版本如何获取MAC地址?附旧版本可用代码

Android 11+ 获取局域网设备MAC地址的实现方案

问题背景

在Android 10及更早版本中,可通过NetworkInterface类获取局域网设备的MAC地址,但Android 11及更高版本中该方法会返回空值。而应用商店中的Fing应用却能在高版本系统下正常获取局域网设备列表及对应MAC地址,以下分析可能的实现方式,并附上旧版本的兼容代码。

Android 10及更早版本的兼容代码

public String getDeviceMacAddress(String ipAddress) {
    try {
        InetAddress localIP = InetAddress.getByName(ipAddress);
        NetworkInterface networkInterface = NetworkInterface.getByInetAddress(localIP);
        if (networkInterface == null) {
            return "";
        }
        byte[] hardwareAddress = networkInterface.getHardwareAddress();

        if (hardwareAddress == null) {
            return "";
        }

        StringBuilder stringBuilder = new StringBuilder(18);
        for (byte b : hardwareAddress) {
            if (stringBuilder.length() > 0) {
                stringBuilder.append(":");
            }

            stringBuilder.append(String.format("%02x", b));
        }

        return stringBuilder.toString();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return "";
}

Android 11+ 的可行实现方式

1. 读取系统ARP缓存表

Android系统的ARP缓存表记录了已通信过的局域网设备IP与MAC地址的映射关系,路径为/proc/net/arp。可以通过读取该文件并解析内容来获取信息:

  • 实现步骤:
    • 打开/proc/net/arp文件,按行读取内容
    • 跳过表头行,解析每一行的字段(IP地址、HW type、Flags、MAC地址、Mask、Device)
    • 提取目标IP对应的MAC地址
  • 局限性:只能获取已经与本机通信过的设备,无法探测未建立通信的设备。

2. 主动发送ARP请求探测

通过构造并发送ARP请求包到局域网,监听响应包来获取目标设备的MAC地址:

  • 实现原理:
    • 使用原始套接字(Raw Socket)构造ARP请求数据包,指定目标IP地址
    • 将数据包发送到局域网广播地址,等待目标设备的ARP响应
    • 解析响应数据包中的MAC地址字段
  • 权限要求:需要在AndroidManifest.xml中声明android.permission.INTERNET权限,部分版本可能需要ACCESS_WIFI_STATE权限来获取局域网信息。
  • 优势:可以主动探测局域网内所有在线设备,不受ARP缓存的限制,这也是Fing等网络扫描应用的核心实现方式。

3. 利用WifiManager隐藏API(不推荐)

部分Android版本的WifiManager存在隐藏方法可获取周边设备MAC地址,但这类方法属于非公开API,随系统版本更新可能被移除,且使用时会触发权限警告,不建议用于正式应用。

内容的提问来源于stack exchange,提问作者HaSel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:15:18