一直以为 Android 6.0 的变化不大的,结果今天发现并非如此。事实是,新功能性的扩展并不大,但是在保守主义的路上却很有成效。
对硬件信息的访问,其管控更加严格。SD 卡的读写,除了权限声明之外,还应该动态请求,否则就会被禁止。读取设备的 IMEI 也一样,这下子,不知道数据统计那些公司会怎么办。至于 MAC 网络地址和蓝牙地址的获取,相应的 API 返回的最新结果都是 02:00:00:00:00:00 这个固定值。可以参见 http://stackoverflow.com/questions/33159224/getting-mac-address-in-android-6-0。按照官方解释,这是为了“更好的数据保护”,可以参见 Android 6.0 变化一文(https://developer.android.com/about/versions/marshmallow/android-6.0-changes.html#behavior-hardware-id)中 Access to Hardware Identifier 一节。
当然,从目前来看,似乎有些地方还没有完全封禁严实,但是这个方向一旦确立并迈出了步伐,估计也就是个时间问题。
获取 MAC 的传统方法:
1 2 |
final WifiManager wifiManager = (WifiManager) getApplication().getApplicationContext().getSystemService(Context.WIFI_SERVICE); final String wifiMACaddress = wifiManager.getConnectionInfo().getMacAddress(); |
稍微不那么专业点的方法则是查看文件 “/sys/class/net/” + networkInterfaceName + “/address”,接口名可以是 wlan0 或者 eth1 之类的。
看上去比较专业的是这个:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
public static String getWifiMacAddress() { try { String interfaceName = "wlan0"; List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); for (NetworkInterface intf : interfaces) { if (!intf.getName().equalsIgnoreCase(interfaceName)){ continue; } byte[] mac = intf.getHardwareAddress(); if (mac==null){ return ""; } StringBuilder buf = new StringBuilder(); for (byte aMac : mac) { buf.append(String.format("%02X:", aMac)); } if (buf.length()>0) { buf.deleteCharAt(buf.length() - 1); } return buf.toString(); } } catch (Exception ex) { } // for now eat exceptions return ""; } |
来源:http://stackoverflow.com/questions/31329733/how-to-get-the-missing-wifi-mac-address-on-android-m-preview。