2

我正在使用代码来获取我的设备正在使用的 IPv4 地址:

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().toUpperCase();
                    boolean isIPv4 = InetAddressUtils.isIPv4Address(sAddr); 
                    if (useIPv4) {
                        if (isIPv4) 
                            return sAddr;
                    } else {
                        if (!isIPv4) {
                            int delim = sAddr.indexOf('%'); // drop ip6 port suffix
                            return delim<0 ? sAddr : sAddr.substring(0, delim);
                        }
                    }
                }
            }
        }
    } catch (Exception ex) { } // for now eat exceptions
    return "";
}

我的三星 Galaxy Express 已连接到 WiFi,并且有一张启用了手机的 sim 卡。

我从上面的代码中得到的 IP 是 10. 地址,这表明手机正在使用手机信号,当我需要它使用网络上可用的 192. 地址时。

有没有办法改变上面的代码来选择 192. 如果有的话?还是这手机有问题?

我试过禁用移动网络,进入飞行模式等。

唯一有效的方法是移除 sim 卡!!我不能指望用户这样做只是为了获得一个内部地址?

谢谢

4

1 回答 1

3

我很想知道是否有更好的方法......

但现在,寻找“wlan0”地址。此外,下面的代码将为您过滤掉环回地址。

List<NetworkInterface> interfaces;
try {
    interfaces = Collections.list(NetworkInterface.getNetworkInterfaces());
    for (NetworkInterface ni : interfaces)
    {
        if ((ni.isLoopback() == false) && ni.isUp() && (ni.getName().equals("wlan0")))
        {

            // enumerate ip addresses on this network interface (e.g. ni.getInetAddresses()

            // return the first one that is is Ipv4

        }
    }

您应该将上述代码与对 android.net.ConnectivityManager 的调用结合起来,以确认您在 wifi 上。

于 2014-01-10T19:22:41.933 回答