2012-06-21 25 views
19

Pracuję nad aplikacją, której wifi, gdzie użytkownik zostanie poproszony o podanie hasła do skanowanej sieci, którą wybierze, jeśli użytkownik wprowadzi poprawne hasło, połączy się i działa dobrze. Ale gdy użytkownik wprowadzi błędne hasło, zostanie dodana nowa sieć o tej nazwie i nie będzie uwierzytelniać cos o nieprawidłowym haśle i będzie miało status problemu z uwierzytelnianiem.Jak programowo zapomnieć o sieci bezprzewodowej w systemie Android?

Teraz, jeśli użytkownik próbuje ponownie zeskanować i wybrać tę samą sieć i wprowadzić poprawne hasło, nie łączy się, mimo że hasło jest teraz poprawne i ma wyłączony status, ponieważ poprzednie połączenie nadal pokazuje status problemu z uwierzytelnianiem.

Jak rozwiązać ten problem? Czy można zapomnieć o wszystkich sieciach za pomocą ConnectivityManager lub wifimanager? Lub jakiekolwiek inne rozwiązanie?

Odpowiedz

7

Kod WifiManager source, ma tę 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żna go używać. Ale według tego komentarza:

Funkcja ta jest używana zamiast sekwencji removeNetwork() i saveConfiguration()

można spróbować użyć: removeNetwork() i saveConfiguration() zamiast.

+0

removeNetwork() rozwiązuje problem. Wielkie dzięki! :) – Aadi

3

Możesz użyć metody removeNetwork(), aby usunąć nadmiarowe połączenia sieciowe (chociaż mam wątpliwości, czy będą one miały ten sam netId), a następnie dodać połączenie świeżo, aby uniknąć problemu.

+2

removeNetwork() rozwiązało problem! podczas konfigurowania konfiguracji czytałem identyfikator sieci na zmienną, więc gdy sieć nie może się połączyć, usunąłem ją przy użyciu tego samego identyfikatora w 'removeNetwork()' :) – Aadi

13

Tak, removeNetwork() 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(); 
} 
0

W ten sposób możliwe jest, aby uzyskać listę sieci skonfigurowanych na liście, a następnie natychmiast wykonać kasowanie i oszczędzać.

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