NetworkInterface.getHardwareAddress获取变量MAC地址

冰川箭仙

冰川箭仙

2026-05-08

648人浏览

原创

networkinterface.gethardwareaddress() 在 android 多数场景下返回 null,因系统自 6.0 起限制普通应用访问硬件地址,子用户、未开 wifi 或非系统签名时均被内核或 selinux 过滤;推荐组合使用 wifi 接口获取、网卡遍历及系统文件读取等替代方案。

networkinterface.gethardwareaddress获取变量mac地址

直接调用 NetworkInterface.getHardwareAddress() 获取 MAC 地址,在多数 Android 场景下会返回 null,不是代码写错了,而是系统有意限制——尤其在非主用户、非系统签名、未开启 WiFi 或目标网卡不可见时。

为什么经常返回 null?

这个方法底层依赖 Linux 的 getifaddrs() 和 netlink 通信,但 Android 从 6.0(API 23)起加强隐私管控:

  • 普通应用默认无权读取硬件地址,即使声明了 ACCESS_WIFI_STATE 也不够
  • 子用户(如访客模式、工作资料)中,eth0wlan0 等接口的 MAC 地址被内核层过滤,getHardwareAddress() 拿不到原始数据
  • 设备未连接 WiFi 时,WifiManager.getConnectionInfo().getMacAddress() 也返回 "02:00:00:00:00:00" 或空字符串
  • Android 10+ 默认禁用 android.permission.ACCESS_FINE_LOCATION 关联的硬件标识权限,影响底层网络接口枚举

更稳妥的替代方案

不依赖单一 API,组合判断可提升成功率:

PyCharm 2026.2.0.1 Mac版
PyCharm 2026.2.0.1 Mac版

PyCharm 2026.2.0.1 Mac版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合在macOS系统上进行 Python 项目开发、运行、调试和测试。

下载
  • 优先尝试 WiFi 接口:确保 WiFi 已开启且已连接,再调用 WifiManager.getConnectionInfo().getMacAddress(),需声明 ACCESS_WIFI_STATE
  • 遍历可用网卡并过滤:用 NetworkInterface.getNetworkInterfaces() 枚举所有接口,跳过 isLoopback()isVirtual()!isUp() 的项,对每个接口调用 getHardwareAddress(),取首个非 null 结果
  • 读取系统文件(需 root 或调试权限):如 /sys/class/net/wlan0/address/proc/net/arp(后者只含已通信过的设备 MAC,非本机)
  • 系统级适配(仅限系统应用):若为 system/priv-app,可在 manifest 中添加 android:sharedUserId="android.uid.system" 并通过 SELinux 策略放开 net_admin 权限,绕过 bionic 层的用户隔离限制

简单可用的 Java 示例

以下代码兼顾兼容性与健壮性,适用于 Android 5.0+:

public static String getMacAddress(Context context) {
    // 方式1:WiFi 连接时获取
    WifiManager wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    if (wifi != null && wifi.isWifiEnabled()) {
        WifiInfo info = wifi.getConnectionInfo();
        if (info != null && info.getMacAddress() != null) {
            String mac = info.getMacAddress().trim();
            if (!"02:00:00:00:00:00".equals(mac) && !mac.isEmpty()) {
                return mac;
            }
        }
    }

    // 方式2:遍历网卡
    try {
        Enumeration<networkinterface> interfaces = NetworkInterface.getNetworkInterfaces();
        while (interfaces.hasMoreElements()) {
            NetworkInterface ni = interfaces.nextElement();
            if (!ni.isUp() || ni.isLoopback() || ni.isVirtual()) continue;
            byte[] mac = ni.getHardwareAddress();
            if (mac != null && mac.length == 6) {
                return String.format("%02X:%02X:%02X:%02X:%02X:%02X",
                    mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
            }
        }
    } catch (Exception ignored) {}

    return "unknown";
}
</networkinterface>

特别注意子用户场景

在 userId ≠ 0 的子用户中(如企业工作资料、儿童模式),即使你是系统应用,getHardwareAddress() 仍大概率返回 null。根本原因在于 bionic 的 ifaddrs.cpp 在构造地址列表时,按用户命名空间过滤了 AF_PACKET 类型地址。此时唯一可靠路径是:

  • 由主用户进程通过 Binder 提供 MAC 查询服务(跨用户通信)
  • 或改用蓝牙地址(BluetoothAdapter.getAddress())、Android ID、Advertising ID 等可替代的设备标识

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
java
java

Java是一个通用术语,用于表示Java软件及其组件,包括“Java运行时环境 (JRE)”、“Java虚拟机 (JVM)”以及“插件”。php中文网还为大家带了Java相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

2023.06.15

3792

6

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

2023.07.05

2796

9

java自学难吗
java自学难吗

Java自学并不难。Java语言相对于其他一些编程语言而言,有着较为简洁和易读的语法,本专题为大家提供java自学难吗相关的文章,大家可以免费体验。

2023.07.31

2824

8

java配置jdk环境变量
java配置jdk环境变量

Java是一种广泛使用的高级编程语言,用于开发各种类型的应用程序。为了能够在计算机上正确运行和编译Java代码,需要正确配置Java Development Kit(JDK)环境变量。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.01

637

3

java保留两位小数
java保留两位小数

Java是一种广泛应用于编程领域的高级编程语言。在Java中,保留两位小数是指在进行数值计算或输出时,限制小数部分只有两位有效数字,并将多余的位数进行四舍五入或截取。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.02

602

3

java基本数据类型
java基本数据类型

java基本数据类型有:1、byte;2、short;3、int;4、long;5、float;6、double;7、char;8、boolean。本专题为大家提供java基本数据类型的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

705

5

java有什么用
java有什么用

java可以开发应用程序、移动应用、Web应用、企业级应用、嵌入式系统等方面。本专题为大家提供java有什么用的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

1290

5

java在线网站
java在线网站

Java在线网站是指提供Java编程学习、实践和交流平台的网络服务。近年来,随着Java语言在软件开发领域的广泛应用,越来越多的人对Java编程感兴趣,并希望能够通过在线网站来学习和提高自己的Java编程技能。php中文网给大家带来了相关的视频、教程以及文章,欢迎大家前来学习阅读和下载。

2023.08.03

18844

3

配置java环境变量
配置java环境变量

配置Java环境变量是为了让操作系统能够识别和使用Java的相关命令和功能。本专题为大家提供配置java环境变量相关文章,帮助大家解决问题。

2023.08.03

646

8

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
安装 Xdebug 并配置 phpstorm
安装 Xdebug 并配置 phpstorm

共1课时 | 125人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 19万人学习

好课诞生记
好课诞生记

共20课时 | 6.9万人学习