早期Android版本App内连接指定的WIFI还是比较简单的,但是随着Android版本的提升,限制也越来越多。以下是一套完整的Android 11以上的WIFI应用内主动连接方案。
第一步:添加到建议连接:
val wifiManager = getSystemService(WIFI_SERVICE) as WifiManager
//一定要加,不然切换指定WIFI无效
wifiManager.removeNetworkSuggestions(wifiManager.networkSuggestions)
val suggestion = WifiNetworkSuggestion.Builder()
.setSsid(ssid)
.setWpa2Passphrase((pwd))
.setIsAppInteractionRequired(false)
.build()
val suggestionsList = ArrayList<WifiNetworkSuggestion>()
suggestionsList.add(suggestion)
val status: Int = wifiManager.addNetworkSuggestions(suggestionsList)
if (status == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
}
但是这里有一个问题:这个是建议,不一定能连上。这就很让人难受!
第二步:监听网络状态:
private val networkCallback = object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d(TAG, "用户已连接到网络")
val capabilities = mConnectivityManager!!.getNetworkCapabilities(network)
Log.d(TAG, "$capabilities")
if (capabilities?.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) == true) {
// 获取当前连接的WiFi信息
val wifiInfo = wifiManager!!.connectionInfo
Log.d(TAG, "wifi info = $wifiInfo")
if (wifiInfo.ssid == String.format("\"%s\"", TEST_WIFI_SSID))
) {
Log.d(TAG, "用户已连接到建议的网络")
Prefs.isWifiConnected = true
Prefs.currentWifiSsid = wifiInfo.ssid
}
}
}
override fun onUnavailable() {
super.onUnavailable()
Log.d(TAG, "用户未连接到建议的网络")
clearWifiState()
}
}
mConnectivityManager = getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
// 注册回调
val request = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
mConnectivityManager?.registerNetworkCallback(request, networkCallback)
第三步:如果10s内未主动连接上,跳转到WIFI设置页(注意:到这个页面也会主动连接,目测基本100%成功率)
lifecycleScope.launch {
delay(10_000)
if (!Prefs.isWifiConnected) {
val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
startActivity(intent)
}
}