web-dev-qa-db-fra.com

Comment oublier un réseau sans fil dans Android par programme?

Je travaille sur une application qui wifi, où il sera demandé à l'utilisateur de saisir un mot de passe pour le réseau analysé qu'il a sélectionné. Si l'utilisateur saisit un mot de passe correct, il se connecte et fonctionne correctement. Mais lorsque l'utilisateur entre un mot de passe incorrect, un nouveau réseau est ajouté avec ce nom. Il ne parviendra pas à s'authentifier car le mot de passe sera incorrect et le statut d'authentification sera défectueux.

Désormais, si l'utilisateur tente à nouveau de numériser et de sélectionner le même réseau, et entre le mot de passe correct, la connexion échoue, même si le mot de passe est correct et son statut est désactivé, car la connexion précédente indique toujours le statut d'incident d'authentification.

Comment résoudre ce problème? Est-il possible d'oublier tous les réseaux utilisant ConnectivityManager ou wifimanager? Ou toute autre solution?

21
Adarsh H S

Le code source WifiManager a cette méthode:

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

Mais cette méthode est @hide, nous ne pouvons donc pas l'utiliser. Mais selon ce commentaire:

Cette fonction est utilisée à la place d'une séquence de removeNetwork() et saveConfiguration()

Vous pouvez essayer d'utiliser: removeNetwork() et saveConfiguration() à la place.

11
idiottiger

Oui, removeNetwork() fonctionne. Je l'ai utilisé pour supprimer tous les réseaux. 

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

wifiManager.saveConfiguration ()

Cette méthode était obsolète dans l'API de niveau 26. Il n'est pas nécessaire d'appeler Cette méthode - addNetwork (WifiConfiguration), UpdateNetwork (WifiConfiguration) et removeNetwork (int) persistent déjà Le configurations automatiquement.

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

19
krishnan

Vous pouvez utiliser la méthode removeNetwork() pour supprimer les connexions réseau redondantes (bien que je doute qu'elles aient la même valeur netId), puis ajouter la connexion récemment pour éviter le problème que vous rencontrez.

3
Kazekage Gaara
wifiManager.saveConfiguration(); 

est déprécié dans Android M. Il n'est plus nécessaire d'appeler saveConfiguration car removeNetwork (int) persiste déjà automatiquement dans les configurations.

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

1
Isham

En faisant cela, il est possible d’obtenir la liste des réseaux configurés, puis d’exécuter immédiatement la suppression et la sauvegarde.

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

vous avez besoin de l'autorisation spécifique.

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
edgal muoz