How to forget a wireless network in android programmatically?

纵然是瞬间 提交于 2019-12-17 22:16:42

问题


I am working on an app which wifi , where user will be asked to enter password for the scanned network he selects, if user enters a correct password, it connects and works well. But when user enters wrong password, a new network is added with that name, and will be failing to authenticate cos of wrong password, and it will be having authentication problem status.

Now if user tries to again scan and select the same network, and enters correct password, it fails to connect even though password now is correct and will have disabled status, since the previous connection is still showing that authentication problem status.

How to solve this problem? Is there any way to forget all networks using ConnectivityManager or wifimanager? Or any other solution?


回答1:


The WifiManager source code, has this method:

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

But this method is @hide, so we can't use it. But according to this comment:

This function is used instead of a sequence of removeNetwork() and saveConfiguration()

You can try to use: removeNetwork() and saveConfiguration() instead.




回答2:


Yes, removeNetwork() works. I used this to remove all networks.

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

wifiManager.saveConfiguration()

This method was deprecated in API level 26. There is no need to call this method - addNetwork(WifiConfiguration), updateNetwork(WifiConfiguration) and removeNetwork(int) already persist the configurations automatically.

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




回答3:


You can use the removeNetwork() method to remove the redundant network connections(though I have a doubt if they will have the same netId) and then add the connection freshly to avoid the problem you are having.




回答4:


wifiManager.saveConfiguration(); 

is deprectated in Android M. No longer need to call saveConfiguration as removeNetwork(int) already persist the configurations automatically.

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




回答5:


By doing this it is possible to get the list of networks configured in a list, then immediately perform the deletion and save.

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



回答6:


you need the especific permission.

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


来源:https://stackoverflow.com/questions/11134383/how-to-forget-a-wireless-network-in-android-programmatically

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!