我正在开发一个VoIP应用程序。在VoIP通话过程中,当用户从WiFi切换到移动数据时,我处理场景时遇到了问题。
在我的呼叫屏幕活动中,我已经注册了一个接收器,可以帮助我获得有关网络更改情况的通知。
以下是我用于检测onRecieve方法中网络变化的代码。
使用上述方法,我能够检测到网络变化。但是当我连接WiFi时,会发生一件奇怪的事情。当我的应用程序最初启动时,它连接了移动数据。当用户进入自己所知道的WiFi区域时,他会连接到自己所知道的WiFi。由于WiFi始终被选择为默认路由,Android切换到WiFi并且我收到了网络通知,提示WiFi已经打开。
因此,我将我的应用程序IP地址更新为WiFi IP地址,所以这里没有问题。但是同时移动数据仍然连接着,但是getActiveNetworkInfo()明确告诉我我已连接到WiFi,即使我早先连接到移动数据。
所以问题在于当用户关闭WiFi按钮时,移动数据仍然连接着,但我仍然收到WiFi关闭的通知。 这表明即使手机仍然连接到移动数据,网络也已经断开连接。
但是一秒钟后,我收到一个移动数据已连接的通知。 但是一旦我收到网络断开连接的通知,我就关闭了VoIP电话。 所以当我收到WiFi关闭的通知时,我如何确保移动数据仍然连接着。
我尝试了getActiveNetworkInfo(),但当我收到WiFi关闭的通知时,它会变成null。
我遵循了这些链接: Android API调用以确定用户设置的“数据启用” 如何判断“移动网络数据”是否已启用或禁用(即使通过WiFi连接)? 使用上述链接,当用户连接到移动数据时,我能够检测到移动数据按钮已启用,它会给我true。 但是当出现特定情况时,问题就会发生。
现在当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关闭的通知时,它会变成null。
我遵循了这些链接: Android API调用以确定用户设置的“数据启用” 如何判断“移动网络数据”是否已启用或禁用(即使通过WiFi连接)? 使用上述链接,当用户连接到移动数据时,我能够检测到移动数据按钮已启用,它会给我true。 但是当出现特定情况时,问题就会发生。
现在当wifi被禁用时,我收到通知,但它显示移动数据已禁用,即使我的移动数据已启用。我无法处理这种情况,因为当我收到断开连接的通知时,我会断开我的电话。