Come dimenticare una rete wireless in Android a livello di programmazione?

Sto lavorando su un’app quale wifi, dove all’utente verrà chiesto di inserire la password per la rete scansionata che seleziona, se l’utente immette una password corretta, si connette e funziona bene. Ma quando l’utente immette una password errata, viene aggiunta una nuova rete con quel nome e non riuscirà ad autenticare cos di una password errata e avrà lo stato di problema di autenticazione.

Ora, se l’utente tenta di eseguire nuovamente la scansione e selezionare la stessa rete e inserisce la password corretta, non riesce a connettersi anche se la password ora è corretta e avrà lo stato disabilitato, poiché la connessione precedente mostra ancora lo stato del problema di autenticazione.

Come risolvere questo problema? C’è un modo per dimenticare tutte le reti usando ConnectivityManager o wifimanager? O qualsiasi altra soluzione?

Solutions Collecting From Web of "Come dimenticare una rete wireless in Android a livello di programmazione?"

Il codice sorgente di WifiManager ha questo metodo:

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

Ma questo metodo è @hide , quindi non possiamo usarlo. Ma secondo questo commento:

Questa funzione viene utilizzata al posto di una sequenza di removeNetwork() e saveConfiguration()

Puoi provare a utilizzare: removeNetwork() e saveConfiguration() .

Sì, removeNetwork() funziona. L’ho usato per rimuovere tutte le reti.

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

wifiManager.saveConfiguration ()

Questo metodo è stato dichiarato obsoleto al livello API 26. Non è necessario chiamare questo metodo: addNetwork (WifiConfiguration), updateNetwork (WifiConfiguration) e removeNetwork (int) mantengono già automaticamente le configurazioni.

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

È ansible utilizzare il metodo removeNetwork() per rimuovere le connessioni di rete ridondanti (anche se ho il dubbio che abbiano lo stesso netId ) e quindi aggiungere la connessione di recente per evitare il problema che si sta verificando.

 wifiManager.saveConfiguration(); 

è deprecato in Android M. Non è più necessario chiamare saveConfiguration come removeNetwork (int) già persiste automaticamente le configurazioni.

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

In questo modo è ansible ottenere l’elenco delle reti configurate in un elenco, quindi eseguire immediatamente la cancellazione e il salvataggio.

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

hai bisogno dell’authorization specifica.

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