【发布时间】:2018-06-13 07:15:21
【问题描述】:
我正在构建一个 VoIP 应用程序。在 VoIP 通话期间,当用户在 WiFi 和移动数据之间切换时,我在处理该场景时遇到了问题。
在我的呼叫屏幕活动中,我已注册接收器,这有助于我获得有关网络变化情况的通知。
这是我用来检测 onRecieve 方法中网络变化的代码。 conn_name 是私有类级别的变量,保存以前的连接名称。
ConnectivityManager connectivity_mgr = ((ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE));
NetworkInfo net_info = connectivity_mgr.getActiveNetworkInfo();
if (net_info != null && net_info.isConnectedOrConnecting() && !conn_name.equalsIgnoreCase("")) {
new_con = net_info.getExtraInfo();
if (new_con != null && !new_con.equalsIgnoreCase(conn_name))
network_changed = true;
conn_name = (new_con == null) ? "" : new_con;
connectionStatus ="connected";
} else {
if (net_info != null && conn_name.equalsIgnoreCase("")) {
conn_name = net_info.getExtraInfo();
connectionStatus ="connected";
network_changed = true;
} else if(!new_con.equals(conn_name)) {
conn_name = "";
connectionStatus ="disconnected";
network_changed = true;
}
}
所以使用上述方法我可以检测到网络变化。但是当我连接到 WiFi 时会发生一件奇怪的事情。当我的应用程序最初启动时,它与移动数据连接。当用户进入他已知的 WiFi 区域时,他会连接到他已知的 WiFi。由于始终选择 WiFi 作为默认路由,Android 切换到 WiFi 并且我收到 WiFi 已打开的网络通知。
所以我将我的应用程序 IP 地址更新为 WiFi IP 地址,所以这里没有问题。但是移动数据仍然同时连接,但 getActiveNetworkInfo() 告诉我,即使我早期连接到移动数据,我也已清楚地连接到 WiFi。
所以问题是当用户关闭 WiFi 按钮时,移动数据仍然连接,但我仍然收到 WiFi 关闭的通知。 即使我的手机仍然连接到移动数据,这表明我的网络已断开。
但一秒钟后,我收到一条通知说移动数据已连接。 但是一旦我收到网络断开连接,我就关闭了我的 VoIP 通话。 因此,当我收到 WiFi 已关闭的通知时,如何确定移动数据是否仍处于连接状态。
我尝试了 getActiveNetworkInfo(),但当我收到关闭 WiFi 的通知时,它恰好为空。
我已经关注了这个链接:
Android API call to determine user setting "Data Enabled"
How to tell if 'Mobile Network Data' is enabled or disabled (even when connected by WiFi)?
使用上面的链接,我可以检测到当用户连接到 mobiledata 时,移动数据按钮已启用。它给了我真实的信息。 但是当这种特殊情况发生时,问题就会发生。
现在当 wifi 被禁用时,我会收到通知,但它显示移动数据被禁用,即使我的移动数据已启用。我无法处理这种情况,因为我在收到断开连接通知时断开了电话。
【问题讨论】:
-
wifi断开时可以保持1-2秒的暂停。然后在 1-2 秒后尝试重新检查移动数据是否可用。
-
@Rahulrr2602 是的,如果我没有任何解决方案,我打算这样做
标签: android networking android-wifi mobile-data android-connectivitymanager