【问题标题】:Connecting to specific wifi sometimes fails on android在 android 上连接到特定的 wifi 有时会失败
【发布时间】:2015-04-23 00:28:23
【问题描述】:

我正在创建一个应用程序,它可以在 ListView 中列出所有可用的 wifi。如果我在列表中选择一个 wifi,它之前在 List<WifiConfiguration> list = wifiManager.getConfiguredNetworks(); 中缓存,那么它应该连接到它。如果WifiConfiguration 列表不包含选定的 wifi,则不会发生任何事情。我的问题是,有时我从列表中选择一个 wifi(我肯定知道它在 WifiConfiguration 列表中),但它没有连接到它。相反,它会连接回之前连接的 wifi。经过一些尝试(一次又一次地选择同一个 wifi)它最终连接到它。这并不总是发生,只是有时。可能是什么问题?这是我的代码 sn-p:

// Go through all the cached wifis and check if the selected GoPro was cached before
for (WifiConfiguration config : configurations) {
    // If it was cached connect to it and that's all
    if (config.SSID != null && config.SSID.equals("\"" + mDrawerListView.getAdapter().getItem(position) + "\"")) {
        // Log
        Log.i("onReceive", "Connecting to: " + config.SSID);
        mWifiManager.disconnect();
        mWifiManager.enableNetwork(config.networkId, true);
        mWifiManager.reconnect();
        break;
     }
}

【问题讨论】:

    标签: android android-wifi


    【解决方案1】:

    您好,您可以更改要连接到的网络的优先级,而不是禁用以前的网络,而不是更改所有其他已配置的网络,然后再重新连接()。它将连接到范围内优先级最高的网络。

     wificonfig.priority = 10000; 
     wifiManager.updateNetwork(wificonfig);
     wifiManager.saveConfiguration();
     wifiManager.disconnect();
     wifiManager.enableNetwork(i.networkId, false);
     wifiManager.reconnect();
    

    【讨论】:

      【解决方案2】:

      这就是正在发生的事情。基本上,您可以告诉操作系统禁用网络,也可以告诉操作系统启用网络,但无法告诉操作系统连接到哪个网络。

      如果范围内有多个 WiFi 接入点都配置在设备上(并且都处于enabled 状态),操作系统将决定连接到哪一个。

      强制操作系统连接到范围内的一个网络而不是另一个网络的唯一方法是在您不想连接的范围内的网络上调用disableNetwork()

      让我们逐行浏览您的代码:

      mWifiManager.disconnect();
      

      上面的行告诉操作系统断开与当前连接的 WiFi 接入点的连接。

      mWifiManager.enableNetwork(config.networkId, true);
      

      如果之前处于disabled 状态,上面的行告诉设备将网络设置为enabled 状态。

      mWifiManager.reconnect(); 
      

      来自the documentation

      重新连接到当前活动的接入点,如果我们当前 断开连接。这可能会导致状态的异步传递 更改事件。

      因此,当您说它会重新连接到之前连接的 wifi。,它的工作方式与预期完全一样,因为操作系统正在重新连接到它认为的 当前活动访问点

      如果您真的想禁用其他网络以便操作系统连接到您刚刚单击的网络,您可以执行以下操作:

      // Go through all the cached wifis and check if the selected GoPro was cached before
      
      WifiInfo info = mWifiManager.getConnectionInfo(); //get WifiInfo
      int id = info.getNetworkId(); //get id of currently connected network
      
      for (WifiConfiguration config : configurations) {
          // If it was cached connect to it and that's all
          if (config.SSID != null && config.SSID.equals("\"" + mDrawerListView.getAdapter().getItem(position) + "\"")) {
              // Log
              Log.i("onReceive", "Connecting to: " + config.SSID);
      
              mWifiManager.disconnect();
      
              mWifiManager.disableNetwork(id); //disable current network
      
              mWifiManager.enableNetwork(config.networkId, true);
              mWifiManager.reconnect();
              break;
           }
      }
      

      【讨论】:

      • 感谢丹尼尔的简短解释!你的解释真的很有道理!我离开了我正在开发的机器,但明天它将是第一件事!
      • 我刚刚测试了您的解决方案,效果很好,谢谢!
      • 可能很重要的是要知道,从 Android 6 开始,事情已经发生了变化:developer.android.com/about/versions/marshmallow/… 据我了解,只有在此网络之前已启用此网络时,才能禁用网络相同的应用程序
      • 我的经验是它适用于 Android 6 和 7,但不再适用于 8。 disableNetwork 只是返回 false,可能是由于 soey 提到的更改。
      • 我认为你的代码是错误的,因为“配置”意味着你已经连接到这个网络至少 1 次,我正在寻找第一次连接到网络的方法
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2023-04-09
      • 2015-08-13
      • 1970-01-01
      • 2012-03-10
      • 2022-06-13
      相关资源
      最近更新 更多