java - redes - ¿Cómo olvidar una red inalámbrica en Android programáticamente?
eliminar redes ethernet windows 10 (6)
Estoy trabajando en una aplicación que wifi, donde se le pedirá al usuario que ingrese la contraseña para la red escaneada que selecciona, si el usuario ingresa una contraseña correcta, se conecta y funciona bien. Pero cuando el usuario ingresa una contraseña incorrecta, se agrega una nueva red con ese nombre, y no podrá autenticar el cos porque la contraseña es incorrecta, y tendrá un estado de problema de autenticación.
Ahora, si el usuario intenta nuevamente escanear y seleccionar la misma red, e ingresa la contraseña correcta, no se puede conectar a pesar de que la contraseña ahora es correcta y tendrá el estado desactivado, ya que la conexión anterior aún muestra el estado del problema de autenticación.
¿Cómo resolver este problema? ¿Hay alguna forma de olvidar todas las redes usando ConnectivityManager o wifimanager? ¿O alguna otra solución?
Al hacer esto, es posible obtener la lista de redes configuradas en una lista, luego realizar inmediatamente la eliminación y guardar.
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
wifiManager.removeNetwork(i.networkId);
wifiManager.saveConfiguration();
}
Puede usar el método removeNetwork()
para eliminar las conexiones de red redundantes (aunque tengo una duda sobre si tendrán la misma netId
) y luego agregue la conexión nuevamente para evitar el problema que está teniendo.
Sí, removeNetwork()
funciona. Utilicé esto para eliminar todas las redes.
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
wifiManager.removeNetwork(i.networkId);
//wifiManager.saveConfiguration();
}
wifiManager.saveConfiguration ()
Este método quedó en desuso en el nivel 26 de la API. No es necesario llamar a este método: addNetwork (WifiConfiguration), updateNetwork (WifiConfiguration) y removeNetwork (int) ya persisten en las configuraciones automáticamente.
https://developer.android.com/reference/android/net/wifi/WifiManager.html#saveConfiguration()
necesitas el permiso especifico
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);
El código fuente de WifiManager
, tiene este método:
/*
* 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);
}
Pero este método es @hide
, por lo que no podemos usarlo. Pero según este comentario:
Esta función se utiliza en lugar de una secuencia de
removeNetwork()
ysaveConfiguration()
Puede intentar usar: removeNetwork()
y saveConfiguration()
lugar.
wifiManager.saveConfiguration();
se desactiva en Android M. Ya no es necesario llamar a saveConfiguration, ya que removeNetwork (int) ya conserva las configuraciones automáticamente.
https://developer.android.com/reference/android/net/wifi/WifiManager.html#saveConfiguration()