我已经看过几个BroadcastReciever示例来检测wifi断开连接,但它们似乎都没有正常工作(例如,每个断开连接触发两次)并且没有提到检查ssid,这是否可能?
所以只是为了澄清,我想检测与特定ssid的断开连接。在设备上禁用了实际的断开连接而非禁用wifi。
由于
编辑:重新开放,因为两个我们必须测试的设备无效。
答案 0 :(得分:8)
NETWORK_STATE_CHANGED_ACTION最终得到了答案。注册此事件时出现问题的设备在卸载另一个应用程序(也会监听类似事件)时开始工作!不知道应用程序如何或为何阻止使用其他应用程序注册的事件。最终解决方案最终成为了;
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
}
}
}
答案 1 :(得分:1)
您确定同一状态有两次通知吗?总是有两个断开阶段:
WifiManager.WIFI_STATE_DISABLING
WifiManager.WIFI_STATE_DISABLED
答案 2 :(得分:0)
我的代码检测(和重新广播)连接和断开连接(不是通过禁用wifi)并将SSID作为额外包括如下。我读过的大部分内容建议使用SUPPLICANT_CONNECTION_CHANGE_ACTION,但这只是无法正常工作,它似乎只会在我的设备(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);
}
}
}
}
}
答案 3 :(得分:0)
我在一些自定义的roms中遇到了同样的问题。我使用“android.net.wifi.STATE_CHANGE”来监听网络变化。在接收器中,我使用“(NetworkInfo)intent.getParcelableExtra(”networkInfo“))。getState()”来获取网络状态。有三种状态:DISCONNECTED,CONNECTING,CONNECTED。您可以使用DISCONNECTED来检测网络是否已断开连接。
如果您的情况适用(HTC One X(4.1)),请告诉我。