我们正在使用
NetworkInterface.getHardwareAddress()
来获取 MAC 地址,但从 Android 11 中的 MAC 地址可用性更改可以看出,现在它不会用于 Android 11。
有解决方案或任何指南吗?
Android 指南强制停止使用 MAC 地址作为标识。正如您发布的链接,还有其他选择。如果您想在 Android 11 中使用 MAC 地址,几乎不可能获得相同的 MAC 地址,即使使用 hafiza 的代码(您忘记告知还有一些额外的清单权限)。
在我的应用程序中,我一直使用 MAC 地址验证,直到 Android 9.0(Pie),但现在我使用库 FingerprintJS Android,这是获取某种 id 的非常有用的解决方案。我已经在 Android 9.0、Android 10 和 Android 11 上进行了测试,没有任何实际问题或随机值。
在我的 Android 项目中,我使用以下代码来获取适用于所有 Android 版本的 MAC 地址。
但现在不再...所以现在我们无法获取MAC地址。请参阅不要使用 MAC 地址。
我们用来获取 MAC 地址的旧方法:
public static String getMacAddress() {
try {
List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
for (NetworkInterface networkInterface : all) {
if (!networkInterface.getName().equalsIgnoreCase("wlan0"))
continue;
byte[] macBytes = networkInterface.getHardwareAddress();
if (macBytes == null) {
return "";
}
StringBuilder res1 = new StringBuilder();
Log.e("Get MAC address", "getMacAddr: " + res1.toString());
for (byte b : macBytes) {
// res1.append(Integer.toHexString(b & 0xFF) + ":");
res1.append(String.format("%02X:", b));
}
if (res1.length() > 0) {
res1.deleteCharAt(res1.length() - 1);
}
return res1.toString().replace(":", "-");
}
} catch (Exception ex) {
Log.e("TAG", "getMacAddr: ", ex);
}
return "";
}
使用此代码,我可以获取 Android 11 中的 MAC 地址。
fun getEthMac(): String {
var macAddress = "Not able to read the MAC address"
var br: BufferedReader? = null
try {
br = BufferedReader(FileReader("/sys/class/net/eth0/address"))
macAddress = br.readLine().uppercase()
} catch (e: IOException) {
e.printStackTrace()
} finally {
if (br != null) {
try {
br.close()
} catch (e: IOException) {
e.printStackTrace()
}
}
}
return macAddress
}
需要注意的是,对于不同的设备和不同的 Android 版本,此文件位置可能会有所不同。所以在不同的设备和不同的Android版本上测试这个功能很重要,以确保文件可以访问并且可以正确读取MAC地址。
您的应用程序必须享有特权。没有其他的长期答案。一些解决方法可能在 Android 11/12 中使用宽松的 selinux 上下文或工程/用户调试构建变体(自定义 rom),但不适用于强制 selinux 上下文或用户构建变体(官方 rom)。
Android 政策会促使您将应用程序开发为特权应用程序,无论您的用户情况是什么。
特权应用程序可以使用具有
NetworkInterface
受保护权限的 android.permission.LOCAL_MAC_ADDRESS
类来查询真实的 Mac 地址,就像以前的 Android 版本一样。
获得特权地位:
/system/priv-app
位置 + privapp-permission.xml
清单 + LOCAL_MAC_ADDRESS
受保护权限LOCAL_MAC_ADDRESS
受保护权限+平台签名对于常规应用程序,请忘记它。
参见: