【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,就像博文中展示的那样。

相关推荐
恋猫de小郭3 小时前
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
android·ide·android studio
aaaweiaaaaaa6 小时前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
工程师老罗8 小时前
Android记事本App设计开发项目实战教程2025最新版Android Studio
android
pengyu12 小时前
系统化掌握 Dart 编程之异常处理(二):从防御到艺术的进阶之路
android·flutter·dart
消失的旧时光-194312 小时前
android Camera 的进化
android
基哥的奋斗历程13 小时前
Openfga 授权模型搭建
android·adb
Pakho love1 天前
Linux:文件与fd(被打开的文件)
android·linux·c语言·c++
勿忘初心911 天前
Android车机DIY开发之软件篇(九) NXP AutomotiveOS编译
android·arm开发·经验分享·嵌入式硬件·mcu
lingllllove1 天前
PHP中配置 variables_order详解
android·开发语言·php
消失的旧时光-19431 天前
Android-音频采集
android·音视频