English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Detailed explanation of the Android Wifi forget() operation example
When processing a certain Wifi connection, we sometimes need to forget the current connection password information. To perform this operation, we need to call the WifiManager::forget() function:
/** * 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. * @param listener for callbacks on success or failure. Can be null. * @throws IllegalStateException if the WifiManager instance needs to be * initialized again * @hide */ public void forget(int netId, ActionListener listener) { if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); validateChannel(); sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); }
Из описания функции можно понять, что вызов функции forget() удалит конфигурацию текущего подключения из файла wpa_supplicant.conf; после этого сеть не будет автоматически подключаться, так как в файле конфигурации уже нет информации о сети.
Трекинг сообщения FORGET_NETWORK, обработчик ClientHandler в WifiServiceImpl::
case WifiManager.FORGET_NETWORK: if (isOwner(msg.sendingUid)) { mWifiStateMachine.sendMessage(Message.obtain(msg)); } else { Slog.e(TAG, "Forget is not authorized for user"); replyFailed(msg, WifiManager.FORGET_NETWORK_FAILED, WifiManager.NOT_AUTHORIZED); } break;
Просто перетаскиваем это сообщение в WifiStateMachine. В этот момент Wifi соединен, текущее состояние WifiStateMachine - ConnectedState, его родительское состояние ConnectModeState обрабатывает:
case WifiManager.FORGET_NETWORK: // Debug only, remember last configuration that was forgotten WifiConfiguration toRemove = mWifiConfigStore.getWifiConfiguration(message.arg1); if (toRemove == null) { lastForgetConfigurationAttempt = null; } else { lastForgetConfigurationAttempt = new WifiConfiguration(toRemove); } // проверка, что вызыватель owns this network netId = message.arg1; if (!mWifiConfigStore.canModifyNetwork(message.sendingUid, netId, /* onlyAnnotate */ false)) { logw("Not authorized to forget network " + " cnid=" + netId + " uid=" + message.sendingUid); replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, WifiManager.NOT_AUTHORIZED); break; } if (mWifiConfigStore.forgetNetwork(message.arg1)) { replyToMessage(message, WifiManager.FORGET_NETWORK_SUCCEEDED); broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_FORGOT, (WifiConfiguration) message.obj); } else { loge("Failed to forget network"); replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, WifiManager.ERROR); } break;
mWifiConfigStore.forgetNetwork():
/** * Forget the specified network and save config * * @param netId network to forget * @return {@code true} if it succeeds, {@code false} otherwise */ boolean forgetNetwork(int netId) { if (showNetworks) localLog("forgetNetwork", netId); WifiConfiguration config = mConfiguredNetworks.get(netId); boolean remove = removeConfigAndSendBroadcastIfNeeded(netId); if (!remove) {}} //success but we dont want to remove the network from supplicant conf file return true; } if (mWifiNative.removeNetwork(netId)) { if (config != null && config.isPasspoint()) { writePasspointConfigs(config.FQDN, null); } mWifiNative.saveConfig(); writeKnownNetworkHistory(true); return true; } else { loge("Не удалось удалить сеть " + netId); return false; } }
В зависимости от传入 текущего идентификатора сети netId, вызывается метод removeNetwork() и saveConfig() из WifiNative для удаления конфигурационных данных файла conf и их сохранения; после выполнения функция forget() завершает работу. По коду我们发现, вызов функции forget() не вызывает переключения состояния WifiStateMachine.
Спасибо за чтение, я надеюсь, что это поможет вам, спасибо за поддержку этого сайта!
Заявление: содержимое этой статьи взято из интернета, авторские права принадлежат их законным владельцам, контент был предоставлен пользователями интернета в порядке самостоятельной подачи, этот сайт не имеет права собственности, не производил редактирование содержимого и не несет ответственности за связанные с этим法律责任. Если вы обнаружите подозрительное содержимое, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма, пожалуйста, замените # на @) для сообщения о нарушении и предоставьте соответствующие доказательства. В случае подтверждения, этот сайт немедленно удалит涉嫌侵权的内容.