4

我已经看过几个 BroadcastReciever 示例来检测 wifi 断开连接,但它们似乎都不能正常工作(例如,每次断开连接触发两次)并且没有提到检查 ssid,这甚至可能吗?

因此,为了澄清,我想检测与特定 ssid 的断开连接。实际断开连接,而不是在设备上禁用 wifi。

谢谢

编辑:重新打开,因为在我们必须测试的两个设备上都不起作用。

4

4 回答 4

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
            }
        }
    }
于 2013-08-25T06:57:03.310 回答
1

您确定同一状态有两次通知吗?断开连接总是有两个阶段:

WifiManager.WIFI_STATE_DISABLING

WifiManager.WIFI_STATE_DISABLED

于 2013-04-02T10:05:27.850 回答
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);   
                }
            }
        }
    }
}
于 2013-04-04T22:10:03.197 回答
0

我在一些自定义 rom 中遇到了同样的问题。我使用“android.net.wifi.STATE_CHANGE”来监听网络变化。在接收器中,我使用 "(NetworkInfo)intent.getParcelableExtra("networkInfo")).getState()" 来获取网络状态。共有三种状态:DISCONNECTED、CONNECTING、CONNECTED。您可以使用 DISCONNECTED 来检测网络是否断开。

请让我知道它是否适用于您的情况(HTC One X (4.1))。

于 2014-03-02T09:22:10.817 回答