如何从运行 Android 11 的 Android 设备获取 MAC 地址?

问题描述 投票:0回答:4

我们正在使用

NetworkInterface.getHardwareAddress()
来获取 MAC 地址,但从 Android 11 中的 MAC 地址可用性更改可以看出,现在它不会用于 Android 11

有解决方案或任何指南吗?

android operating-system mac-address android-11
4个回答
3
投票

Android 指南强制停止使用 MAC 地址作为标识。正如您发布的链接,还有其他选择。如果您想在 Android 11 中使用 MAC 地址,几乎不可能获得相同的 MAC 地址,即使使用 hafiza 的代码(您忘记告知还有一些额外的清单权限)。

在我的应用程序中,我一直使用 MAC 地址验证,直到 Android 9.0(Pie),但现在我使用库 FingerprintJS Android,这是获取某种 id 的非常有用的解决方案。我已经在 Android 9.0、Android 10 和 Android 11 上进行了测试,没有任何实际问题或随机值。


1
投票

在我的 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 "";
}

0
投票

使用此代码,我可以获取 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地址。


0
投票

您的应用程序必须享有特权。没有其他的长期答案。一些解决方法可能在 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
    受保护权限+平台签名

对于常规应用程序,请忘记它。

参见:

© www.soinside.com 2019 - 2024. All rights reserved.