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?
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()
esaveConfiguration()
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);