【问题标题】:Android - Correct way to detect disconnecting from a particular wifi ssid?Android - 检测与特定 wifi ssid 断开连接的正确方法?
【发布时间】:2013-04-02 09:55:11
【问题描述】:

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

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

谢谢

编辑:在我们必须测试的两个设备上重新打开,因为没有任何效果。

【问题讨论】:

    标签: android broadcastreceiver android-wifi


    【解决方案1】:

    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
                }
            }
        }
    

    【讨论】:

    • 没有办法从 NetworkInfo.State.DISCONNECTED 获取 Ssid 吗?
    • 您好,您在哪里定义了 WifiStateHistory 类?谢谢
    【解决方案2】:

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

    WifiManager.WIFI_STATE_DISABLING

    WifiManager.WIFI_STATE_DISABLED

    【讨论】:

      【解决方案3】:

      我用于检测(和重新广播)连接和断开连接(不是通过禁用 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);   
                      }
                  }
              }
          }
      }
      

      【讨论】:

      • 我将不得不重新打开它,因为监听 SUPPLICANT_STATE_CHANGED_ACTION 以显示 DISCONNECTED 在其他开发人员的 HTC One X (4.1) 上不起作用,即使它在我的 Nexus 4 上运行良好。 HTC 在断开连接时直接进入扫描状态。然后我们再次尝试了 NETWORK_STATE_CHANGED_ACTION,它在 Nexus 上是可靠的,在 HTC 上不起作用!令人难以置信的令人沮丧,因为这实际上是阻止我们推出应用程序测试版的唯一原因。
      【解决方案4】:

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

      如果它适用于您的情况,请告诉我(HTC One X (4.1))。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-11
        • 2017-08-10
        • 2016-04-27
        • 1970-01-01
        • 2017-02-02
        相关资源
        最近更新 更多