【问题标题】:How to forget a wireless network in android programmatically?如何以编程方式忘记android中的无线网络?
【发布时间】:2012-06-23 11:09:21
【问题描述】:

我正在开发一个 wifi 应用程序,用户将被要求输入他选择的扫描网络的密码,如果用户输入正确的密码,它会连接并运行良好。但是当用户输入错误的密码时,一个新的网络会以该名称添加,并且将无法验证密码错误的 cos,并且会出现验证问题状态。

现在如果用户尝试再次扫描并选择相同的网络,并输入正确的密码,即使密码正确,它也无法连接,并且将处于禁用状态,因为之前的连接仍然显示身份验证问题状态。

如何解决这个问题? 有没有办法使用 ConnectivityManager 或 wifimanager 忘记所有网络?还是其他解决方案?

【问题讨论】:

标签: java android android-wifi android-internet android-wireless


【解决方案1】:

您可以使用removeNetwork() 方法删除冗余网络连接(尽管我怀疑它们是否具有相同的netId),然后重新添加连接以避免您遇到的问题。

【讨论】:

  • removeNetwork() 解决了这个问题!同时,在设置配置时,我将 networkID 读取到一个变量中,这样当网络连接失败时,我使用 removeNetwork() 中的相同 ID 将其删除:)
【解决方案2】:

WifiManager源码,有这个方法:

/*
 * Delete the network in the supplicant config.
 *
 * This function is used instead of a sequence of removeNetwork()
 * and saveConfiguration().
 *
 * @param config the set of variables that describe the configuration,
 *            contained in a {@link WifiConfiguration} object.
 * @hide
 */

public void forgetNetwork(int netId) {
    if (netId < 0) {
        return;
    }
    mAsyncChannel.sendMessage(CMD_FORGET_NETWORK, netId);
}

但是这个方法是@hide,所以我们不能用。但根据这条评论:

这个函数用来代替removeNetwork()的序列和 saveConfiguration()

您可以尝试改用:removeNetwork()saveConfiguration()

【讨论】:

    【解决方案3】:

    是的,removeNetwork() 有效。我用它来删除所有网络。

    List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
    for( WifiConfiguration i : list ) {
        wifiManager.removeNetwork(i.networkId);
        //wifiManager.saveConfiguration();  
    }
    

    wifiManager.saveConfiguration()

    此方法在 API 级别 26 中已弃用。无需调用 这个方法 - addNetwork(WifiConfiguration), updateNetwork(WifiConfiguration) 和 removeNetwork(int) 已经存在 自动配置。

    https://developer.android.com/reference/android/net/wifi/WifiManager.html#saveConfiguration()

    【讨论】:

    • wifiManager.saveConfiguration();不推荐使用什么是替代使用
    【解决方案4】:

    通过这样做可以获得列表中配置的网络列表,然后立即执行删除并保存。

    WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
            List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
            for( WifiConfiguration i : list ) {
                wifiManager.removeNetwork(i.networkId);
                wifiManager.saveConfiguration();
            }
    

    【讨论】:

      【解决方案5】:
      wifiManager.saveConfiguration(); 
      

      在 Android M 中已弃用。不再需要调用 saveConfiguration,因为 removeNetwork(int) 已经自动持久化配置。

      https://developer.android.com/reference/android/net/wifi/WifiManager.html#saveConfiguration()

      【讨论】:

        【解决方案6】:

        您需要特定权限。

        final int numOpenNetworksKept = Build.VERSION.SDK_INT >= 17
                        ? Settings.Secure.getInt(resolver, Settings.Global.WIFI_NUM_OPEN_NETWORKS_KEPT, 10)
                        : Settings.Secure.getInt(resolver, Settings.Secure.WIFI_NUM_OPEN_NETWORKS_KEPT, 10);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-02-02
          • 2013-01-01
          相关资源
          最近更新 更多