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

Posted

技术标签:

【中文标题】设备在Android中连接到WiFi时如何获取蜂窝网络的IP地址【英文标题】:How to get IP address of cellular network when device is connected to WiFi in Android 【发布时间】:2017-04-01 21:41:52 【问题描述】:

有没有一种方法可以让我同时在 android 中获取 WiFi 和蜂窝网络的 IP 地址。我尝试使用许多示例,但只能获取 WiFi 网络而不是蜂窝网络的地址。我同时启用了 WiFi 和蜂窝网络和设备正在通过 WiFi 访问互联网。

这是我用来获取 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 地址。如果是,那如何可行。

【问题讨论】:

我不认为这是可能的。由于将为您的 IP 通道分配 IP 地址,因此 WIFI/MobileData 一次可能只有一个通道处于活动状态。 【参考方案1】:

当您在设备上启用 WiFi 并与 WiFi 网络建立有效连接时,您的移动数据将暂时禁用,无论您是否手动启用它。仅当您没有活动的 WiFi 连接时才会考虑“移动数据开/关”设置。

一些自定义 ROM 可以选择在您连接到 WiFi 时保持移动连接处于活动状态(因此,如果您失去 WiFi 连接,它会更快地切换到移动连接),但仍然使用 WiFi 连接。

结论:你不能同时获得两个IP地址,因为你不能同时打开WiFi和移动网络(如果可以,你只能主动使用WiFi)

【讨论】:

我不确定这是否完全正确。一方面,有几种情况,其中手机在两个接口上进行通信: - Wifi 处于热点模式,共享移动连接。 - Wifi 不提供互联网接入。在这种情况下,现代手机以不同的方式路由本地和互联网请求。但即使我连接到正确的 Wifi,我也可以获得两个接口的 IP 地址。我怀疑在这种情况下您是否可以发出通过移动网络路由的请求,但它确实已连接并且具有有效的 IP(在 Nexus 5x 和 Pixel 3 上尝试过)。【参考方案2】:

试试这个可能会有帮助.....

对于移动 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();

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

可能是 How to get IP address of the device 的副本

【讨论】:

要可靠地获取蜂窝 IP 地址,您需要确保接口的名称以“rmnet”开头。 另外你需要通过isLinkLocalAddress()确定接口地址不是链接本地地址。【参考方案3】:
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());

【讨论】:

【参考方案4】:

在您的 java 代码中使用以下代码:

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

不要忘记在您的 Android 清单文件中添加此权限:&lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&gt;

来源:Get Wifi IP Address

希望对您有所帮助!祝你好运!

【讨论】:

【参考方案5】:

当您的 wifi 启用并连接时,您将无法获得用于蜂窝连接的 IP。这是因为系统出于省电的原因不使用蜂窝数据连接。尽管您可以同时启用它们,但系统一次只能使用一个。就像:两者都允许,但只使用一个。

我只能想到一个例子:当您通过 wifi 连接到无法访问 Internet 的网络时,您的手机也会通过蜂窝连接。

【讨论】:

以上是关于设备在Android中连接到WiFi时如何获取蜂窝网络的IP地址的主要内容,如果未能解决你的问题,请参考以下文章

如果在 Android 中连接到 BLE 设备失败,如何通知用户?

如何在bash中连接到wifi?

如何在 QT 或 windows API 中连接到无线 WIFI 网络? [关闭]

反应原生无法从蜂窝网络找到位置

以编程方式将设备连接到android中的同一wifi网络?

Android:如何检查设备是不是通过 WiFi - Direct 连接到另一台设备?