如何在安卓系统中以编程方式忘记一个无线网络?

29

我正在开发一个Wi-Fi应用程序,用户将被要求输入所选择的扫描到的网络的密码。如果用户输入正确的密码,则连接将成功并正常工作。但是,当用户输入错误的密码时,会添加一个新的具有相同名称的网络,并因为密码错误而无法验证,此时它将显示认证问题状态。

现在,如果用户再次扫描并选择相同的网络,并输入正确的密码,它将无法连接,尽管密码现在是正确的,而且还会显示已禁用状态,因为以前的连接仍然显示着认证问题状态。

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


点击此链接以获取更多详细信息:https://dev59.com/Q1wY5IYBdhLWcg3wU2bA#51081719 - Akshay Kumar S
6个回答

25

是的,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(); 已经过时,有什么替代方案可用? - Gowthaman M

13

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()方法来移除冗余的网络连接(虽然我有疑虑它们是否具有相同的netId),然后重新添加连接,以避免你遇到的问题。

2
removeNetwork() 解决了问题!在设置配置时,我将networkID读取到一个变量中,因此当网络连接失败时,我使用相同的id通过 removeNetwork() 将其删除 :) - Adarsh H S

1

0

你需要特定的权限。

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);

0
通过这种方式,可以获取配置在列表中的网络列表,然后立即执行删除并保存。
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for( WifiConfiguration i : list ) {
            wifiManager.removeNetwork(i.networkId);
            wifiManager.saveConfiguration();
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接