【问题标题】:WifiConfiguration enable network in LollipopWifiConfiguration 在 Lollipop 中启用网络
【发布时间】:2015-01-15 03:38:45
【问题描述】:

我正在做 Wifi 项目,有一个模块可以让用户以编程方式加入 wifi。

在 kitkat 及以下版本中可以成功运行,但在 Lollipop 中则无法正常运行。

代码如下:

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.SSID = "\"testSSID\"";
wifiConfiguration.hiddenSSID = true;
wifiConfiguration.status = WifiConfiguration.Status.ENABLED;
wifiConfiguration.allowedKeyManagement
.set(WifiConfiguration.KeyMgmt.NONE);
netId = wifiManager.addNetwork(wifiConfiguration);
Log.d("WifiPreference", "add Network returned " + netId);
boolean checkEnableWifi = wifiManager.enableNetwork(netId, true);
Log.d("WifiPreference", "enableNetwork returned " + checkEnableWifi);

我测试的设备是 nexus 5 内部版本号 LRX21O,我的代码中是否有问题或 Lollipop 上的错误?

【问题讨论】:

    标签: android android-wifi android-5.0-lollipop


    【解决方案1】:

    我在 Nexus 7 上连接到 hp 打印机时遇到了一种情况,其中方法 enablenetwork(id,true) 返回 true 但仍然无法连接。 @Santosh 和 @Seraphim 的回答帮助了我..禁用每个网络并仅启用所需的 SSID 有效。

    【讨论】:

      【解决方案2】:

      试试这个。不要禁用其他已保存的网络。因为当您选择的网络不可用时,它将阻碍 wifi 在其他网络上的回退。玩优先。

      /*
       *  Max priority of network to be associated.
       */
      private static final int MAX_PRIORITY = 999999;
      
      /**
       * Allow a previously configured network to be associated with.
       */
      public boolean enableNetwork(String ssid) {
          boolean state = false;
          List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
      
          if(list != null && list.size() > 0) {
              for( WifiConfiguration i : list ) {
                  if(i.SSID != null && i.SSID.equals(convertToQuotedString(ssid))) {
      
                      wifiManager.disconnect();
      
                      int newPri = getMaxPriority() + 1;
                      if(newPri >= MAX_PRIORITY) {
                          // We have reached a rare situation.
                          newPri = shiftPriorityAndSave();
                      }
      
                      i.priority = newPri;
                      wifiManager.updateNetwork(i);
                      wifiManager.saveConfiguration();
      
                      state = wifiManager.enableNetwork(i.networkId, true);
                      wifiManager.reconnect();
                      break;
                  }
              }
          }
      
          return state;
      }
      
      private int getMaxPriority() {
          final List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
          int pri = 0;
          for (final WifiConfiguration config : configurations) {
              if (config.priority > pri) {
                  pri = config.priority;
              }
          }
          return pri;
      }
      
      private void sortByPriority(final List<WifiConfiguration> configurations) {
          Collections.sort(configurations,
              new Comparator<WifiConfiguration>() {
                  @Override
                  public int compare(WifiConfiguration object1, WifiConfiguration object2) {
                      return object1.priority - object2.priority;
                  }
              });
      }
      
      private int shiftPriorityAndSave() {
          final List<WifiConfiguration> configurations = wifiManager.getConfiguredNetworks();
          sortByPriority(configurations);
          final int size = configurations.size();
          for (int i = 0; i < size; i++) {
              final WifiConfiguration config = configurations.get(i);
              config.priority = i;
              wifiManager.updateNetwork(config);
          }
          wifiManager.saveConfiguration();
          return size;
      }
      
      /**
       * Add quotes to string if not already present.
       *
       * @param string
       * @return
       */
      public static String convertToQuotedString(String string) {
          if (TextUtils.isEmpty(string)) {
              return "";
          }
      
          final int lastPos = string.length() - 1;
          if (lastPos > 0
                  && (string.charAt(0) == '"' && string.charAt(lastPos) == '"')) {
              return string;
          }
      
          return "\"" + string + "\"";
      }
      

      【讨论】:

      • 似乎工作正常(尽管我注意到各种设备之间的连接速度存在很多差异)。谢谢,我认为禁用其他网络是不可接受的。
      • 在我的设备上禁用网络不足。这似乎可行。
      • 您可以更改 Android 6+ 的优先级吗?
      • 测试6+,没问题。
      【解决方案3】:

      在棒棒糖上遇到类似问题。

      手动禁用其他网络,然后重新连接 wifi 管理器解决了这个问题。

      boolean enableNework(String ssid, Context cxt) {
          boolean state = false;
          WifiManager wm = (WifiManager) cxt.getSystemService(Context.WIFI_SERVICE);
          if (wm.setWifiEnabled(true)) {
              List<WifiConfiguration> networks = wm.getConfiguredNetworks();
              Iterator<WifiConfiguration> iterator = networks.iterator();
              while (iterator.hasNext()) {
                  WifiConfiguration wifiConfig = iterator.next();
                  if (wifiConfig.SSID.equals(ssid))
                      state = wm.enableNetwork(wifiConfig.networkId, true);
                  else
                      wm.disableNetwork(wifiConfig.networkId);
              }
              wm.reconnect();
          }
          return state;
      }
      

      【讨论】:

      • 遇到类似问题,谢谢!这是我的问题:stackoverflow.com/questions/26982778/…
      • 它有点适合我。肿瘤坏死因子。在 Nexus 7 上,连接显示为“身份验证问题”。进入并触摸“连接”即可完成连接。某种时间问题?
      • 另外,这似乎不适用于 Android ICS 4.0.4。旧方法在那里工作得很好。好痛啊……
      • @SoloPilot 你设法让它工作了吗?我的问题stackoverflow.com/questions/41712432/…
      【解决方案4】:

      尝试在您尝试禁用其他网络的地方设置 false。

      wifiManager.enableNetwork(netId, false);
      

      如果您的 addNetwork 成功,还有一件事,那么您可以继续其余的事情。如果它返回 -1,则您无法调用 enableNetwork,因为您使用的 netId 将是 -1。所以理想情况下你可以做的是

      netId = wifiManager.addNetwork(wifiConfiguration);
      if(netId >= 0){
      Log.d("WifiPreference", "add Network returned " + netId);
      boolean checkEnableWifi = wifiManager.enableNetwork(netId, true);
      Log.d("WifiPreference", "enableNetwork returned " + checkEnableWifi);
      }
      

      【讨论】:

        【解决方案5】:

        尝试添加 wifiManager.setWifiEnabled(true);在代码的末尾。

        【讨论】:

        • 还是不行。它在 Wi-Fi 设置中标记为已保存
        猜你喜欢
        • 1970-01-01
        • 2016-11-12
        • 1970-01-01
        • 2015-01-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-08
        • 2016-12-09
        相关资源
        最近更新 更多