早期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!!.connectionInfoLog.d(TAG, "wifi info = $wifiInfo")if (wifiInfo.ssid == String.format("\"%s\"", TEST_WIFI_SSID))) {Log.d(TAG, "用戶已連接到建議的網絡")Prefs.isWifiConnected = truePrefs.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)}}