首页 > 解决方案 > 无法使用适用于 Android 的以太网管理器检索有线网络的 IP 和 MAC 地址

问题描述

我为 Android 4.4 设备开发了一个应用程序,我试图在其中使用EthernetManager检索 IP 地址和 MAC 地址为有线网络检索 IP 地址和 MAC 地址。现在,当我尝试在 Android 5.1.1 设备上运行此应用程序时,我没有获得 IP 地址和 MAC 地址。我已经提供了超级用户访问权限。

我无法让它工作:

public string GetInterfaceName()=>(string)ethernetManager.Class.GetMethod("getEthernetIfaceName").Invoke(ethernetManager);

错误日志:

2020-02-18 16:20:37.8485 [INFO] [4] HttpService - 尝试通过“GetWiredNetworkConfiguration”调用获取有线网络连接数据。2020-02-18 16:20:37.9114 [错误] [4] HttpService - getEthernetIfaceName [] 2020-02-18 16:20:37.9114 [INFO] [4] HttpServer - 对请求/有线网络/配置的响应:Java .Lang.NoSuchMethodException:Java.Interop.JniEnvironment+InstanceMethods.CallObjectMethod 处的 getEthernetIfaceName [](Java.Interop.JniObjectReference 实例,Java.Interop.JniMethodInfo 方法,Java.Interop.JniArgumentValue* args)[0x0006e] 在 Java 处:0。 Interop.JniPeerMembers+JniInstanceMethods.InvokeAbstractObjectMethod (System.String encodedMember, Java.Interop.IJavaPeerable self, Java.Interop.JniArgumentValue* parameters) [0x00014] in :0 at Java.Lang.Class.GetMethod (System.String name, Java.朗。

MAC地址获取函数:

private string GetMacAddress(string interfaceName)
{
    var ethernetInterface = NetworkInterface.GetByName(interfaceName);
    if (ethernetInterface != null)
    {
        var bytes = ethernetInterface.GetHardwareAddress();
        if (bytes != null)
        {
            var result = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                result.Append($"{bytes[i]:X2}");
                if (i != bytes.Length - 1)
                {
                    result.Append(":");
                }
            }
            return result.ToString();
        }
    }
    return "Not Available";
}

请告知上述方法是否适用于 Android 4.4,或者我是否必须对 Android 5.1.1 使用其他方法,或者我在这里做错了什么?

标签: javac#androidxamarin.androidethernet

解决方案


如果你想获取安卓设备的mac地址,你可以试试下面的代码。我没有 Android 4.4 和 5.1.1,我在未经许可的情况下在 Android 6.0 上测试,它运行良好。

  public static string getMacAddress()
    {
        string macAddress = string.Empty;

        var all = Collections.List(Java.Net.NetworkInterface.NetworkInterfaces);

        foreach (var interfaces in all)
        {
            if (!(interfaces as Java.Net.NetworkInterface).Name.Contains("wlan0")) continue;

            var macBytes = (interfaces as
            Java.Net.NetworkInterface).GetHardwareAddress();
            if (macBytes == null) continue;

            var sb = new System.Text.StringBuilder();
            foreach (var b in macBytes)
            {
                string convertedByte = string.Empty;
                convertedByte = (b & 0xFF).ToString("X2") + ":";

                if (convertedByte.Length == 1)
                {
                    convertedByte.Insert(0, "0");
                }
                sb.Append(convertedByte);
            }

            macAddress = sb.ToString().Remove(sb.Length - 1);

            return macAddress;
        }
        return "02:00:00:00:00:00";
    }

从代码中获取:

在此处输入图像描述

从安卓设备获取:

在此处输入图像描述

我从类似的线程中获取代码:https ://stackoverflow.com/a/43981078/11850033


推荐阅读