Jak programowo zapomnieć o sieci bezprzewodowej w Androidzie?

Pracuję nad aplikacją, która wifi, gdzie użytkownik zostanie poproszony o podanie hasła do zeskanowanej sieci, którą wybiera, jeśli użytkownik wprowadzi poprawne hasło, łączy się i działa dobrze. Ale gdy użytkownik wprowadzi błędne hasło, nowa sieć zostanie dodana o tej nazwie i nie uda się uwierzytelnić z powodu niewłaściwego hasła, a to będzie miało status problemu z uwierzytelnieniem.

Teraz, jeśli użytkownik spróbuje ponownie skanować i wybrać tę samą sieć i wprowadzić poprawne hasło, nie połączy się nawet jeśli hasło jest poprawne i będzie miało status wyłączony, ponieważ poprzednie połączenie nadal pokazuje ten status problemu z uwierzytelnianiem.

Jak rozwiązać ten problem? Czy jest jakiś sposób, aby zapomnieć o wszystkich sieciach za pomocą Connectitymanager lub wifimanager? Albo jakieś inne rozwiązanie?

Author: Adarsh H S, 2012-06-21

6 answers

Kod źródłowy WifiManager, ma taką metodę:

/*
 * 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);
}

Ale ta metoda jest @hide, więc nie możemy jej użyć. Ale zgodnie z tym komentarzem:

Funkcja ta jest używana zamiast ciągu removeNetwork() i saveConfiguration()

Możesz spróbować użyć zamiast tego: removeNetwork() i saveConfiguration().

 10
Author: idiottiger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-31 18:22:25

Tak, działa. Użyłem tego do usunięcia wszystkich sieci.

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

WifiManager.saveConfiguration()

Ta metoda była przestarzała w API na poziomie 26. Nie ma potrzeby dzwonić ta metoda-addNetwork (WifiConfiguration), updateNetwork (WifiConfiguration) i removeNetwork (int) już trwają konfiguracje automatycznie.

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

 16
Author: krishnan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-25 11:38:32

Możesz użyć removeNetwork() metoda usuwania nadmiarowych połączeń sieciowych (choć mam wątpliwości, czy będą one miały to samo netId), a następnie dodać połączenie świeżo, aby uniknąć problemu, który masz.

 3
Author: Kazekage Gaara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-21 08:40:26
wifiManager.saveConfiguration(); 

Jest przestarzały w Androidzie M. nie trzeba już wywoływać saveConfiguration, ponieważ removeNetwork (int)automatycznie zapisuje konfiguracje.

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

 1
Author: Isham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-10-10 13:46:23

W ten sposób możliwe jest uzyskanie listy sieci skonfigurowanych na liście, a następnie natychmiastowe usunięcie i zapisanie.

WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
        List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
        for( WifiConfiguration i : list ) {
            wifiManager.removeNetwork(i.networkId);
            wifiManager.saveConfiguration();
        }
 0
Author: Eros Ar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-15 14:57:39

Potrzebujesz specjalnego pozwolenia.

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
Author: edgal muoz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-05-17 21:21:50