【问题标题】:Device IP address returned from Android app different from the phoneAndroid App返回的设备IP地址与手机不同
【发布时间】:2019-11-13 19:35:20
【问题描述】:

Android应用返回的手机IP地址与手机设置中显示的不一样。

我尝试使用以下示例代码读取从移动网络分配给仅连接到移动网络的 Android 手机(运行 Android 7)的 IP。 Android 应用返回 10.130.151.51,但从手机菜单中找到的 IP 地址是 49.130.28.201。

有人知道为什么以及如何获得正确的吗?

public String Get_Mobile_IP(){
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkinterfaces();
             en.hasMoreElements();) {
            NetworkInterface networkinterface = en.nextElement();
            for (Enumeration<InetAddress> en_IP = networkinterface.getInetAddresses(); en__IP.hasMoreElements();) {
                InetAddress mobile_IPaddr = en_IP.nextElement();
                if (!mobile_IPaddr.isLoopbackAddress() && mobile_IPaddr instanceof Inet4Address) {
                    return mobileIPAddr.getHostAddress();
                }

            }
        }
    } catch (Exception ex) {

    }
    return null;
}

【问题讨论】:

  • 我可以使用 Android 编码读取 IP 地址。我遇到的问题是应用程序返回的值与手机的手机菜单中显示的值不一样。
  • 我发现我必须关闭Android手机中的“VoLTE”才能获得正确的结果

标签: android mobile ip-address


【解决方案1】:

你可以试试这个代码:- 您可以使用此方法获取设备的 IP 地址,对于 IPv4 为 true,对于 IPv6 为 false

 public static String getIPAddress(boolean useIPv4) {
try {
    List<NetworkInterface> interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
    for (NetworkInterface intf : interfaces) {
        List<InetAddress> addrs = Collections.list(intf.getInetAddresses());
        for (InetAddress addr : addrs) {
            if (!addr.isLoopbackAddress()) {
                String sAddr = addr.getHostAddress();
                //boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr);
                boolean isIPv4 = sAddr.indexOf(':')<0;

                if (useIPv4) {
                    if (isIPv4) 
                        return sAddr;
                } else {
                    if (!isIPv4) {
                        int delim = sAddr.indexOf('%'); // drop ip6 zone suffix
                        return delim<0 ? sAddr.toUpperCase() : sAddr.substring(0, delim).toUpperCase();
                    }
                }
            }
        }
    }
} catch (Exception ex) { } // for now eat exceptions
return "";

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多