设备在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 清单文件中添加此权限:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
来源:Get Wifi IP Address
希望对您有所帮助!祝你好运!
【讨论】:
【参考方案5】:当您的 wifi 启用并连接时,您将无法获得用于蜂窝连接的 IP。这是因为系统出于省电的原因不使用蜂窝数据连接。尽管您可以同时启用它们,但系统一次只能使用一个。就像:两者都允许,但只使用一个。
我只能想到一个例子:当您通过 wifi 连接到无法访问 Internet 的网络时,您的手机也会通过蜂窝连接。
【讨论】:
以上是关于设备在Android中连接到WiFi时如何获取蜂窝网络的IP地址的主要内容,如果未能解决你的问题,请参考以下文章
如果在 Android 中连接到 BLE 设备失败,如何通知用户?