我使用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" />
答案 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,因为它是全球监控状态的主要标识符之一?