Android-检测与特定wifi ssid断开连接的正确方法?
我见过几个BroadcastReceiver示例来检测wifi断开连接,但它们似乎都不能正常工作(例如,每次断开连接都会触发两次),也没有提到检查ssid,这可能吗 因此,为了澄清,我想检测从特定ssid断开的连接。设备上的实际断开连接且未禁用wifi 谢谢Android-检测与特定wifi ssid断开连接的正确方法?,android,broadcastreceiver,android-wifi,Android,Broadcastreceiver,Android Wifi,我见过几个BroadcastReceiver示例来检测wifi断开连接,但它们似乎都不能正常工作(例如,每次断开连接都会触发两次),也没有提到检查ssid,这可能吗 因此,为了澄清,我想检测从特定ssid断开的连接。设备上的实际断开连接且未禁用wifi 谢谢 编辑:重新打开,因为在我们必须测试的两台设备上都没有任何功能。您确定同一状态有两次通知吗?断开连接通常有两个阶段: WifiManager.WIFI\u状态\u禁用 WifiManager.WIFI_STATE_DISABLED我的代码用于
编辑:重新打开,因为在我们必须测试的两台设备上都没有任何功能。您确定同一状态有两次通知吗?断开连接通常有两个阶段: WifiManager.WIFI\u状态\u禁用 WifiManager.WIFI_STATE_DISABLED我的代码用于检测(和重播)连接和断开连接(而不是通过禁用WIFI),并将SSID作为额外信息包括在内,如下所示。我读到的大部分内容都建议使用“请求连接”或“更改”操作,但这并没有正常工作,它似乎只有在禁用/启用设备(Nexus 4)上的wifi时才会触发,而不是在连接过程中触发。唯一的问题是第一次运行应用程序时,它不会记录当前ssid,因此不知道刚刚连接的网络的ssid是什么。有什么想法吗
public class EventMapper extends BroadcastReceiver
{
private static String lastConnectedSsid = "";
@Override
public void onReceive(Context context, Intent intent)
{
if (intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION))
{
SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE);
if(state == SupplicantState.COMPLETED)
{
WifiManager manager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
lastConnectedSsid = manager.getConnectionInfo().getSSID().replace("\"", "");
Intent newIntent = new Intent();
newIntent.setAction(Event.App_Event_WifiConnected.name());
newIntent.putExtra("App_Events_SSID", lastConnectedSsid);
context.sendBroadcast(newIntent);
}
if(state == SupplicantState.DISCONNECTED)
{
boolean wifiEnabled = ((WifiManager)context.getSystemService(Context.WIFI_SERVICE)).isWifiEnabled();
if(wifiEnabled)
{
Intent newIntent = new Intent();
newIntent.setAction(Event.App_Event_WifiDisconnected.name());
newIntent.putExtra("App_Events_SSID", lastConnectedSsid);
context.sendBroadcast(newIntent);
}
}
}
}
}
网络、状态、改变、行动最终是答案。当卸载另一个应用程序(也将侦听类似事件)时,注册此事件时出现问题的设备开始工作!不知道应用程序如何或为什么会阻止向另一个应用程序注册的事件。最终的解决方案是:
String action = intent.getAction();
if (action.equals(WifiManager.NETWORK_STATE_CHANGED_ACTION))
{
WifiManager manager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
NetworkInfo networkInfo = intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
NetworkInfo.State state = networkInfo.getState();
if(state == NetworkInfo.State.CONNECTED)
{
String connectingToSsid = manager.getConnectionInfo().getSSID().replace("\"", "");
WifiStateHistory.recordConnectedSsid(connectingToSsid);
//connected
}
if(state == NetworkInfo.State.DISCONNECTED)
{
if(manager.isWifiEnabled())
{
String disconnectedFromSsid = WifiStateHistory.getLastConnectedSsid();
//disconnected
}
}
}
我在一些定制ROM中遇到了同样的问题。我用“android.net.wifi.STATE\u CHANGE”来听网络的变化。在receiver中,我使用“(NetworkInfo)intent.getParcelableExtra(“NetworkInfo”)).getState()”来获取网络状态。有三种状态:断开、连接、连接。您可以使用DISCONNECTED来检测网络是否已断开
请让我知道它是否适用于您的情况(HTC One X(4.1))。我将不得不重新打开此文件,因为我正在倾听请求者的状态更改动作,以显示断开连接在其他开发人员的HTC One X(4.1)上不起作用,即使它在我的Nexus 4上运行良好。HTC在断开连接时直接进入扫描状态。然后我们又尝试了网络状态改变动作,这在Nexus上是可靠的,在HTC上不起作用!令人难以置信的沮丧,因为这是阻止我们推出应用程序测试版的唯一原因。没有办法从NetworkInfo.State.DISCONNECTED获取Ssid吗?嗨,什么是WifiStateHistory类,或者在哪里定义WifiStateHistory类?谢谢