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
相关产品推荐
相关产品推荐

