Я пытаюсь подключиться к Wi-Fi с помощью WifiNetworkSpecifier на Android Q. Проблема, с которой я столкнулся, заключается в том, что Android всегда использует последние действительные учетные данные для подключения к AP, даже после того, как я вручную предоставлю новые обновленные учетные данные для WifiNetworkSpecifier.
Это поток:
- Успешно подключитесь к AP.
- Измените пароль сети Wi-Fi.
- Запустите приложение, попробуйте снова подключиться с обновленными учетными данными (предоставлен новый действительный пароль), но приложение не может подключиться к Wi-Fi (проверка подлинности не выполняется).
Если я переверну логику, произойдет то же самое:
- Успешно подключиться к Wi-Fi.
- Запустите приложение, предоставьте ему обновленные учетные данные (новый ложный пароль), но приложению удается подключиться к Wi-Fi.
Дело в том, что как только он подключается к SSID с действующими учетными данными, все, что я помещаю в WifiNetworkSpecifier, похоже, не имеет никакого значения, он просто снова и снова использует эти последние действительные учетные данные.
Это происходит на Google Pixel 2 и на Huawei P30 Lite. Однако на Samsung Galaxy S9 все работает нормально (приложение подключается к сети Wi-Fi, если я обновляю пароль сети Wi-Fi и предоставляю приложению новый действительный пароль; и оно не будет подключаться к Wi-Fi, если я предоставлю ему ложный пароль, оба предполагают, что мы ранее успешно подключились к Wi-Fi).
Проблема с Pixel и Huawei «решается» после перезапуска устройства, но когда я снова подключаюсь к Wi-Fi (вводятся действительные учетные данные), мы возвращаемся к той же проблеме.
Я не уверен, что мне здесь не хватает чего-то тривиального, но любая помощь будет очень признательна! Спасибо!
РЕДАКТИРОВАТЬ: оказывается, вам не нужно вводить действительные учетные данные для запуска этого цикла. Например, если вы пытались подключиться к AP с ложным паролем в первый раз и после попытки подключиться с правильным паролем, система использует этот неправильный пароль (первый введенный пароль) для подключения. Опять же, это происходит на Pixel 2 и Huawei P30 Lite, но отлично работает на Galaxy S9 и S9 +. Это «состояние» все равно очищается при перезагрузке телефона.
Это код:
@RequiresApi(api = Build.VERSION_CODES.Q)
private fun connectToWiFiOnQ(context: Context, wifiCredentials: WifiCredentials) {
val connectivityManager: ConnectivityManager =
context.applicationContext.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkSpecifier = WifiNetworkSpecifier.Builder()
.setSsid(wifiCredentials.networkSSID)
.setWpa2Passphrase(wifiCredentials.password)
.setIsHiddenSsid(wifiCredentials.isSSIDHidden)
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.setNetworkSpecifier(networkSpecifier)
.build()
networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
connectivityManager.bindProcessToNetwork(network)
}
}
networkCallback?.let {
connectivityManager.requestNetwork(request, it)
}
}