Android - 检测与特定wifi ssid断开连接的正确方法?

时间:2013-04-02 09:55:12

标签: android broadcastreceiver android-wifi

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

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

由于

编辑:重新开放,因为两个我们必须测试的设备无效。

4 个答案:

答案 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)),请告诉我。