Android 11以上App主动连接WIFI的完整方案

早期Android版本App内连接指定的WIFI还是比较简单的,但是随着Android版本的提升,限制也越来越多。以下是一套完整的Android 11以上的WIFI应用内主动连接方案。

第一步:添加到建议连接:

Kotlin 复制代码
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) {

}

但是这里有一个问题:这个是建议,不一定能连上。这就很让人难受!

第二步:监听网络状态:

Kotlin 复制代码
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%成功率)

Kotlin 复制代码
lifecycleScope.launch {
            delay(10_000)
            if (!Prefs.isWifiConnected) {
                val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
                startActivity(intent)
            }
        }
相关推荐
我命由我1234514 小时前
Android Compose 开发,使用 ConstraintLayout,但是引入的是旧的 ConstraintLayout
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
小鱼干..14 小时前
http://101.43.154.45:60083/start/index.php?page=hello
android
hai_android14 小时前
Android WorkManager 笔记
android·java
Android打工仔14 小时前
不要再把 Flow 当作一个容器
android·kotlin
我命由我1234514 小时前
Android 开发问题:android.permission.CAMERA...duplicated with element declared at
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
parade岁月15 小时前
倒反天罡!押注 React Native 6 年后,Shopify 又回到了原生开发
android·前端·ios
邪修king15 小时前
MySQL 数据库(三):表级操作实战:增删查改全实例演示 + 企业实操红线规范
android·数据库·mysql
七夜zippoe15 小时前
从 Prompt Engineering 到 Agent Engineering:开发范式的代际跃迁
android·ai·prompt·agent·engineering
音视频开发进阶15 小时前
DuoShot:一次拍摄,让精彩多一种表达
android·duoshot
我命由我1234516 小时前
Android 控件 - ListAdapter
android·java·java-ee·android studio·android jetpack·android-studio·android runtime