关于获取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;
}
运行的结果:
05-09 18:39:31.528: D/mac(5132): interfaceName=wlan0, mac=8C:BE:BE:BD:EC:0E
05-09 18:39:31.528: D/mac(5132): interfaceName=wlan0, mac=8C:BE:BE:BD:EC:0E
05-09 18:39:31.528: D/mac(5132): interfaceName=p2p0, mac=8E:BE:BE:BD:EC:0E
05-09 18:39:31.538: D/mac(5132): interfaceName=dummy0, mac=42:35:AD:88:CE:D2
05-09 18:39:31.538: D/mac(5132): interfaceName=usbnet0, mac=52:D9:15:FA:64:1A
05-09 18:39:31.538: D/mac(5132): interfaceName=rmnet0, mac=C6:76:E0:64:56:AC
这样就可以正常的获取到6.0的mac地址了!希望能帮助大家