关于获取android6.0的mac地址

学向勤中得,萤窗万卷书。这篇文章主要讲述关于获取android6.0的mac地址相关的知识,希望能为你提供帮助。
原文:http://blog.csdn.net/suziluo123/article/details/51382410

【关于获取android6.0的mac地址】最近接触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地址了!希望能帮助大家

    推荐阅读