问题描述:关于连接WiFi失败的原因,在Android开发者平台上说明了对addNetwo这个方法的启用,并且Android Q不支持应用对WiFi进行开关操作。
原因:Android Q 将切断应用对 Wi-Fi 设置的访问权限,防止恶意软件滥用系统功能的访问权限。

针对开关WiFi的解决办法:
startActivity(Intent(Settings.Panel.ACTION_INTERNET_CONNECTIVITY))
针对连接WiFi的解决办法:
wifiName替换成想要连接的WiFi名称,wifiPassword替换成对应的密码。
f (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
val specifier: NetworkSpecifier = WifiNetworkSpecifier.Builder()
.setSsidPattern(PatternMatcher(wifiName, PatternMatcher.PATTERN_PREFIX))
.setWpa2Passphrase(wifPassword)
.build()
val request = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.setNetworkSpecifier(specifier)
.build()
val connectivityManager =
requireActivity()!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val networkCallback: NetworkCallback = object : NetworkCallback() {
override fun onAvailable(network: Network) {
// do success processing here..
when (upOrDown) {
"up" -> {
intoActivityWithBundle(ActivityHolder.SELECT_PERSONNEL, Bundle().apply {
putString("type", "upload")
putString("meetingId", meetingId)
})
}
"down" -> {
intoActivityWithBundle(ActivityHolder.SELECT_PERSONNEL, Bundle().apply {
putString("type", "download")
putString("meetingId", meetingId)
})
}
}
}
override fun onUnavailable() {
// do failure processing here..
}
}
connectivityManager.requestNetwork(request, networkCallback)
// Release the request when done.
// connectivityManager.unregisterNetworkCallback(networkCallback);
} else {//小于Android Q的版本
val wifiSSID = "\"" + wifiName + "\""
val wifiConfiguration = WifiConfiguration().apply {
SSID = wifiSSID
preSharedKey = "\"" + wifPassword + "\""
hiddenSSID = true
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
allowedProtocols.set(WifiConfiguration.Protocol.RSN)
status = WifiConfiguration.Status.ENABLED
// wepKeys[0] = "\"" +psd+ "\""
// wepTxKeyIndex = 0
// allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE)
// allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40)
}
val wifiManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
requireActivity().getSystemService(WifiManager::class.java)
} else {
requireActivity().applicationContext.getSystemService(Context.WIFI_SERVICE)
?.let {
it as WifiManager
}
}
wifiManager?.run {
addNetwork(wifiConfiguration)
val config= configuredNetworks.first {
it.SSID != null && it.SSID == wifiSSID
}
disconnect()
Log.e("===","==networkId==${config.networkId}")
val enableNetwork = enableNetwork(config.networkId, true)
Log.e("===","==enableNetwork==$enableNetwork")
val b = reconnect()
Log.e("==","==reconnect=====$b")
}
}
参考博客:
https://shoewann0402.github.io/2019/03/20/android-q-beta-enable-and-disable-wifi/
https://www.jb51.net/article/183837.htm
官方:https://developer.android.google.cn/guide/topics/connectivity/wifi-bootstrap#kotlin
本文解析了Android Q中对WiFi权限的限制,介绍了如何在Android Q及以上版本使用NetworkRequest API进行连接,以及在旧版本中设置WiFi配置的方法。重点在于提供切换和连接WiFi的工作流程,适用于开发者应对新系统带来的挑战。
1890

被折叠的 条评论
为什么被折叠?



