Как забыть о беспроводной сети в Android программно?
Я работаю над приложением, которое Wi-Fi, где пользователю будет предложено ввести пароль для отсканированной сети, которую он выбирает, если пользователь вводит правильный пароль, он подключается и работает хорошо. Но когда пользователь вводит неправильный пароль, новая сеть добавляется с этим именем, и она не сможет аутентифицировать, потому что неверный пароль, и у нее будет состояние проблемы аутентификации.
Теперь, если пользователь снова попытается отсканировать и выбрать ту же сеть и введет правильный пароль, он не сможет подключиться, даже если пароль теперь правильный и будет отключен, так как предыдущее подключение все еще показывает состояние проблемы проверки подлинности.
Как решить эту проблему? Есть ли способ забыть все сети, используя ConnectivityManager или wifimanager? Или любое другое решение?
6 ответов
WifiManager
Исходный код, имеет этот метод:
/*
* 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);
}
Но этот метод @hide
поэтому мы не можем его использовать. Но согласно этому комментарию:
Эта функция используется вместо последовательности
removeNetwork()
а такжеsaveConfiguration()
Вы можете попробовать использовать: removeNetwork()
а также saveConfiguration()
вместо.
Да, removeNetwork()
работает. Я использовал это, чтобы удалить все сети.
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
wifiManager.removeNetwork(i.networkId);
//wifiManager.saveConfiguration();
}
wifiManager.saveConfiguration ()
Этот метод устарел на уровне API 26. Нет необходимости вызывать этот метод - addNetwork(WifiConfiguration), updateNetwork(WifiConfiguration) и removeNetwork(int) уже сохраняют конфигурации автоматически.
https://developer.android.com/reference/android/net/wifi/WifiManager.html
Вы можете использовать removeNetwork()
способ удалить избыточные сетевые подключения (хотя у меня есть сомнения, будут ли они одинаковыми netId
), а затем добавьте соединение заново, чтобы избежать возникшей проблемы.
wifiManager.saveConfiguration();
больше не поддерживается в Android M. Больше не нужно вызывать saveConfiguration, поскольку removeNetwork(int) уже сохраняет конфигурации автоматически.
https://developer.android.com/reference/android/net/wifi/WifiManager.html
Вам нужно конкретное разрешение.
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);
Делая это, можно получить список сетей, настроенных в списке, а затем немедленно выполнить удаление и сохранить.
WifiManager wifiManager = (WifiManager)context.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> list = wifiManager.getConfiguredNetworks();
for( WifiConfiguration i : list ) {
wifiManager.removeNetwork(i.networkId);
wifiManager.saveConfiguration();
}