【Android】不同系统版本获取设备MAC地址

【Android】不同系统版本获取设备MAC地址

尝试

在开发过程中,想要获取MAC地址,最开始想到的就是WifiManager,但结果始终返回02:00:00:00:00:00,由于用得是wifi ,考虑是不是因为用得网线的原因,但用了wifi 依旧不行。通过Android中Wifi未开启情况下获取Mac地址了解到,WifiManager在无网络情况下也可以获取MAC地址,那么现在无法获取到 正确地址的原因并不是网线和wifi 的问题。

后来考虑用指令cat /sys/class/net/wlan0/address的方式去获取MAC地址,但依旧不行,返回还是02:00:00:00:00:00,那就很奇怪了。

最终找到了一篇大神写的博文详解Android MacAddress 适配心得,很完美的解决了我以上的问题,原来从android 6.0及以上、7.0以下 就不能通过 wifimanager 获取mac,否则获取到的mac将是固定的:02:00:00:00:00:00 。android sdk后来做了6.0适配,通过cat /sys/class/net/wlan0/address,可以在6.0上获取mac地址,但是android 7.0及以上依旧无法获取到mac地址

由于安装的设备是android 9.0的,所有无法获取正确MAC,针对这些情况,博文中给出了3种方案来实现android 7.0以上的mac地址获取:

  • 通过busybox获取本地存储的mac地址
  • 扫描各个网络接口获取mac地址
  • 通过ip地址来获取绑定的mac地址

实现

而我主要使用第三种方案进行了实现,而且不用配置xml 权限,代码如下:

java 复制代码
/**
     * 获取设备的Mac地址
     * @return Mac地址
     */
    public String getLocalMacAddress(){
        String strMacAddr = "";
        try {
            InetAddress ip = getLocalInetAddress();

            byte[] b = NetworkInterface.getByInetAddress(ip)
                    .getHardwareAddress();
            StringBuffer buffer = new StringBuffer();
            for (int i = 0; i < b.length; i++) {
                if (i != 0) {
                    buffer.append(':');
                }
                String str = Integer.toHexString(b[i]&0xFF);
                buffer.append(str.length() == 1 ? 0 + str : str);
            }
            strMacAddr = buffer.toString().toLowerCase();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return strMacAddr;
    }


    /**
     * 获取设备本地IP
     */
    protected InetAddress getLocalInetAddress() {
        InetAddress ip = null;
        try {
            //列举
            Enumeration en_netInterface = NetworkInterface.getNetworkInterfaces();
            //避免多张网卡
            while (en_netInterface.hasMoreElements()) {//是否还有元素
                NetworkInterface ni = (NetworkInterface) en_netInterface.nextElement();//得到下一个元素
                Enumeration en_ip = ni.getInetAddresses();//得到一个ip地址的列举
                while (en_ip.hasMoreElements()) {
                    ip = (InetAddress) en_ip.nextElement();
                    if (!ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1)
                        break;
                    else
                        ip = null;
                }

                if (ip != null) {
                    break;
                }
            }
        } catch (Exception e) {

            e.printStackTrace();
        }
        return ip;
    }

输出结果如下:

使用的话,只要String mac = getLocalMacAddress(); 即可。在这个过程中,尤其要注意,一台设备可能会存在多张网卡,那么对应就会有个mac地址 。所以建议采用本地ip 获取mac的方式去进行,当然也可以直接在 getLocalInetAddress() 中打印输出所有的mac,就像博文中展示的那样。

相关推荐
liang_jy2 小时前
Android 事件分发机制(二)—— 点击事件透传
android·面试·源码
圆号本昊5 小时前
Flutter Android Live2D 2026 实战:模型加载 + 集成渲染 + 显示全流程 + 10 个核心坑( OpenGL )
android·flutter·live2d
冬奇Lab5 小时前
ANR实战分析:一次audioserver死锁引发的系统级故障排查
android·性能优化·debug
冬奇Lab6 小时前
Android车机卡顿案例剖析:从Binder耗尽到单例缺失的深度排查
android·性能优化·debug
ZHANG13HAO6 小时前
调用脚本实现 App 自动升级(无需无感、允许进程中断)
android
圆号本昊7 小时前
【2025最新】Flutter 加载显示 Live2D 角色,实战与踩坑全链路分享
android·flutter
小曹要微笑8 小时前
MySQL的TRIM函数
android·数据库·mysql
mrsyf9 小时前
Android Studio Otter 2(2025.2.2版本)安装和Gradle配置
android·ide·android studio
DB虚空行者9 小时前
MySQL恢复之Binlog格式详解
android·数据库·mysql