• 关于获取android6.0的mac地址


    原文:http://blog.csdn.net/suziluo123/article/details/51382410

    最近接触6.0,发现使用单纯的wifiManager.getConnectionInfo().getMacAddress();方法获取不到MAc地址。后来Google一下发现 Google对硬件信息的访问,其管控更加严格。SD 卡的读写,除了权限声明之外,还应该动态请求,否则就会被禁止。至于 MAC 网络地址的获取,相应的 API 返回的最新结果都是 02:00:00:00:00:00 这个固定值。可以参见 Getting MAC address in Android 6.0。 
    按照官方解释,这是为了更好的数据保护,可以参见 Android 6.0 变化一文中 Access to Hardware Identifier 一节。

    获取 MAC 的传统方法:

    final WifiManager wifiManager = (WifiManager) getApplication()
                    .getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    final String wifiMACaddress = wifiManager.getConnectionInfo()
                    .getMacAddress();

    然而这种方法在6.0上并不好使,那怎么办呢?

    查询资料找到了相应的解决方法: 
    使用Java获取设备网络设备信息的API——NetworkInterface.getNetworkInterfaces() ——仍然可以间接地获取到MAC地址。

    // 有兴趣的朋友可以看下NetworkInterface在Android FrameWork中怎么实现的
        public static String macAddress() throws SocketException {
                String address = null;
                // 把当前机器上的访问网络接口的存入 Enumeration集合中
                Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
                while (interfaces.hasMoreElements()) {
                    NetworkInterface netWork = interfaces.nextElement();
                    // 如果存在硬件地址并可以使用给定的当前权限访问,则返回该硬件地址(通常是 MAC)。 
                    byte[] by = netWork.getHardwareAddress();
                    if (by == null || by.length == 0) {
                        continue;
                    }
                    StringBuilder builder = new StringBuilder();
                    for (byte b : by) {
                        builder.append(String.format("%02X:", b));
                    }
                    if (builder.length() > 0) {
                        builder.deleteCharAt(builder.length() - 1);
                    }
                    String mac = builder.toString();
                    Log.d("mac", "interfaceName="+netWork.getName()+", mac="+mac);
                    // 从路由器上在线设备的MAC地址列表,可以印证设备Wifi的 name 是 wlan0
                    if (netWork.getName().equals("wlan0")) {
                        Log.d("mac", " interfaceName ="+netWork.getName()+", mac="+mac);
                        address = mac;
                    }
                }
                return address;
            } 

    这样就可以正常的获取到6.0的mac地址了!希望能帮助大家

  • 相关阅读:
    2020.04.11【NOIP普及组】模拟赛C组25总结
    【华为云技术分享】云图说 | 容器交付流水线ContainerOps,提升持续交付效率
    【USACO 2020 January Silver】Wormhole Sort 题解
    【华为云技术分享】计算python程序执行时间
    HTAP会成为数据库的未来吗?
    【华为云技术分享】现代富文本编辑器Quill的模块化机制
    Cow Evolution 题解
    【USACO 2020 January Silver】Loan Repayment
    VS2012 黑色护眼主题
    常用的正则表达式
  • 原文地址:https://www.cnblogs.com/tc310/p/7611794.html
Copyright © 2020-2023  润新知