如何在Android设备连接WiFi时获取蜂窝网络的IP地址

22

有没有一种方法可以同时获取Android中WiFi和蜂窝网络的IP地址。我尝试使用许多示例,但只能获取WiFi网络的地址而不是蜂窝网络的地址。我已经启用了WiFi和蜂窝网络,并且设备通过WiFi具有Internet访问权限。

这是我正在使用的获取IP地址的代码:

    String ipAddress = null;
    try {
        for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
            NetworkInterface intf = en.nextElement();
            for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
                InetAddress inetAddress = enumIpAddr.nextElement();
                if (!inetAddress.isLoopbackAddress()) {
                    ipAddress = inetAddress.getHostAddress().toString();
                    Log.i("Here is the Address",ipAddress);
                }
            }
        }
    } catch (SocketException ex) {

    }

当设备连接到WiFi时,是否能够获取蜂窝网络的IP地址。如果可以,那么如何实现呢?


1
我认为这是不可能的。因为IP地址将被分配给您的IP通道,一次只能有一个通道处于活动状态,无线网络/移动数据。 - Madhukar Hebbar
6个回答

16
无论您是否手动启用移动数据,只要在设备上启用WiFi并且连接到WiFi网络,您的移动数据就会被暂时禁用。仅当您没有活动的WiFi连接时,“移动数据开关”设置才会被考虑。
一些自定义ROM有一个选项,可以在连接到WiFi时保持移动连接的活性(因此,如果您失去了WiFi连接,它可以更快地切换到移动网络),但仍然使用WiFi连接。 结论:您无法同时获得两个IP地址,因为您不能同时启用WiFi和移动网络(如果您可以,只能主动使用WiFi)。

我不确定这是否完全正确。一方面,有几种情况下手机会在两个接口上通信:
  • Wifi 处于热点模式,共享移动连接。
  • Wifi 无法访问互联网。在这种情况下,现代手机会以不同的方式路由本地和互联网请求。
但即使我连接到适当的 Wifi,我也可以为两个接口获取 IP 地址。我怀疑在这种情况下你不能发出通过移动网络路由的请求,但它肯定已连接并具有有效的 IP(在 Nexus 5x 和 Pixel 3 上尝试过)。
- Sebastian Staacks

10

我建议你尝试一下这个,也许会有帮助......

关于移动 IP 地址......

 public static String getMobileIPAddress() {
        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()) {
                        return  addr.getHostAddress();
                    }
                }
            }
        } catch (Exception ex) { } // for now eat exceptions
        return "";
    }

对于Wifi IP地址...
  public String getWifiIPAddress() {
        WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
        WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
        int ip = wifiInfo.getIpAddress();
        return  Formatter.formatIpAddress(ip);
    }

将此权限包含在您的清单中...
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

使用方法如下....
String wifiIp = getWifiIPAddress(); 
String mobileIp = getMobileIPAddress();

你会得到这样的输出......

o

可能是如何获取设备的IP地址的重复内容。


为了可靠地获取移动设备的IP地址,您需要确保接口名称以“rmnet”开头。 - Lywx
同时,您需要使用isLinkLocalAddress()来确保接口地址不是本地链接地址。 - Lywx

3
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

3

在您的Java代码中使用以下内容:

    WifiManager wifiMgr = (WifiManager) getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
String ipAddress = Formatter.formatIpAddress(ip);

不要忘记在Android清单文件中添加以下权限:
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

来源:获取Wifi IP地址

希望这能帮到你!祝你好运!


1
当您启用并连接WiFi时,您将无法获得蜂窝连接的IP地址。这是因为出于节省电池的原因,系统不使用蜂窝数据连接。尽管您可以同时启用两者,但系统一次只能使用一个。就像:两者都允许,但只使用一个。
我只能想到一个例子:当您通过WiFi连接到没有互联网访问权限的网络时,您的手机将通过蜂窝连接。

-1
最近在运行原生Android 13的Pixel手机上,开发者选项中有一个“始终保持移动数据活动”开关(用于快速网络切换),因此在已经root的设备上,/system/bin/ifconfig [-S]会报告rmnet(蜂窝数据)和wlan(WiFi)地址。因此,当WiFi连接并处于活动状态时,rmnet地址也是活动的,您可以成功地从远程设备通过Pixel的rmnet地址进行ssh连接,无论是IPv4还是IPv6取决于APN(接入点名称)协议,而不会影响主要的WiFi连接。当然,关键是要知道那个rmnet地址是什么,特别是在IPv6地址不断变化的情况下...手机必须以某种方式将其报告给远程设备。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接