如何在Android Marshmallow中获取Wi-Fi Mac地址

时间:2015-10-13 13:20:38

标签: android

我使用WiFi MAC地址作为唯一ID,从Marshmallow开始返回虚假MAC地址(出于安全原因)。有了这个,我的Android应用程序表现不同。如何获取Android设备的实际MAC地址。

我正在使用以下代码段。

WifiManager wmgr = (WifiManager)getSystemService(Context.WIFI_SERVICE);
String wifiId = wmgr.getConnectionInfo().getMacAddress();

在清单文件中添加了以下权限。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

3 个答案:

答案 0 :(得分:50)

有一种解决方法可以在Android 6.0中获取Mac地址。

首先,您需要添加Internet用户权限。

<uses-permission android:name="android.permission.INTERNET" />

然后你可以通过NetworkInterfaces API找到mac。

public static String getMacAddr() {
    try {
        List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
        for (NetworkInterface nif : all) {
            if (!nif.getName().equalsIgnoreCase("wlan0")) continue;

            byte[] macBytes = nif.getHardwareAddress();
            if (macBytes == null) {
                return "";
            }

            StringBuilder res1 = new StringBuilder();
            for (byte b : macBytes) {
                res1.append(String.format("%02X:",b));
            }

            if (res1.length() > 0) {
                res1.deleteCharAt(res1.length() - 1);
            }
            return res1.toString();
        }
    } catch (Exception ex) {
    }
    return "02:00:00:00:00:00";
}

来源:http://robinhenniges.com/en/android6-get-mac-address-programmatically

答案 1 :(得分:10)

FWIW Rob Anderson发布的解决方案来自他引用的来源,将返回一个带有小写十六进制字符的MAC地址,并且将丢失任何前导零(例如&#34; 12:34:56:78:90: 0A&#34;将成为&#34; 12:34:56:78:90:a&#34;)根据设备,将导致您生成无效的MAC地址。

此行为是由于调用隐藏的AOSP java.lang.IntegralToString :: intToHexString(int i,bool uppercase,int minWidth)方法的示例中使用的Integer.toHexString方法,对于大写标记为false, 0表示minWidth参数。

如果你想要大写和最小宽度为2,那么你可以将IntegralToString :: intToHexString方法添加到项目中,并为这些参数传入true / 2,或者你可以简单地使用String.format(&#34;% 02X&#34;)而不是以大写和宽度为2执行转换。或者甚至更优选;你可以使用String.format(&#34;%02X:&#34;)然后保存你的追加调用,在每个字节后添加冒号。

答案 2 :(得分:0)

我访问了我的Netgear路由器界面,查找了列出连接设备的选项卡,这些设备很好地生成了MAC ID。

如果有疑问,请关闭设备并查看列表,然后将其打开并再次查看。新列表是您的MAC ID。编辑路由器列表以显示该内容。

更大的观点是,它们如何真正隐藏您的MAC ID,因为它是全球监控状态的主要标识符之一?