我正在构建一个 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 调用以确定用户设置“数据已启用”
如何判断“移动网络数据”是启用还是禁用(即使通过 WiFi 连接)?
使用上面的链接,我可以检测到当用户连接 mobiledata 时移动数据按钮已启用。它给了我真实的信息。但是当这种特殊情况发生时,问题就会发生。
现在,当 wifi 被禁用时,我会收到通知,但它显示移动数据被禁用,即使我的移动数据已启用。我无法处理这种情况,因为我在收到已断开连接的通知时会断开呼叫。