You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备未联网时如何通过代码连接指定WiFi

你当前的实现仅支持被动监听已连接的、具备互联网能力的网络,当设备清除已保存的WiFi配置后没有任何活跃网络,自然不会触发NetworkCallback的回调,所以没有对应日志输出。要实现连接指定WiFi的功能,需要增加主动发起WiFi连接的逻辑,不同Android版本的实现方式存在差异,具体方案如下:

1. 权限配置

首先需要在Manifest中声明对应权限,同时在运行时动态申请权限:

  • Android 12(API 31)及以上:ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE、NEARBY_WIFI_DEVICES
  • Android 10(API 29)- 11:ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE,后台发起连接还需额外声明ACCESS_BACKGROUND_LOCATION
  • Android 9及以下:ACCESS_COARSE_LOCATION/ACCESS_FINE_LOCATION、ACCESS_WIFI_STATE、CHANGE_WIFI_STATE

注意:位置权限必须用户授权后,才能正常扫描和连接指定WiFi

2. 主动连接指定WiFi实现

2.1 Android 10(API 29)及以上实现

Android 10之后废弃了WifiManager的addNetwork方法,改用WifiNetworkSpecifier发起连接:

fun connectToTargetWifi(ssid: String, password: String) {
    val wifiSpecifier = WifiNetworkSpecifier.Builder()
        .setSsid(ssid)
        .setWpa2Passphrase(password)
        .build()
    val networkRequest = NetworkRequest.Builder()
        .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
        // 若需要连接无互联网能力的WiFi,需移除INTERNET能力过滤
        .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
        .setNetworkSpecifier(wifiSpecifier)
        .build()
    val connectCallback = object : ConnectivityManager.NetworkCallback() {
        override fun onAvailable(network: Network) {
            super.onAvailable(network)
            // 连接成功后绑定当前应用的网络请求到该WiFi
            connectivityManager.bindProcessToNetwork(network)
            Log.d(TAG, "指定WiFi $ssid 连接成功")
        }

        override fun onUnavailable() {
            super.onUnavailable()
            Log.d(TAG, "指定WiFi连接失败,可能SSID不存在或密码错误")
        }
    }
    connectivityManager.requestNetwork(networkRequest, connectCallback, 15000) // 15s超时
}

2.2 Android 9及以下实现

使用WifiManager的addNetwork方法完成配置和连接:

@Suppress("DEPRECATION")
fun connectToTargetWifiLegacy(ssid: String, password: String) {
    val wifiConfig = WifiConfiguration()
    wifiConfig.SSID = "\"$ssid\"" // SSID需要额外包裹双引号
    wifiConfig.preSharedKey = "\"$password\"" // 密码需要额外包裹双引号
    val networkId = wifiManager.addNetwork(wifiConfig)
    if (networkId == -1) {
        Log.d(TAG, "WiFi配置添加失败")
        return
    }
    // 切换到指定WiFi
    wifiManager.disconnect()
    wifiManager.enableNetwork(networkId, true)
    wifiManager.reconnect()
}

3. 原有监听逻辑适配

如果需要监听无互联网能力的WiFi连接状态,需要修改ConnectionLiveData中的NetworkRequest配置,移除addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)的过滤条件,否则无互联网的WiFi连接不会触发回调。

4. 注意事项

  • 清除已保存WiFi后必须主动调用上述连接方法才会发起连接,原有被动监听逻辑不会主动触发WiFi连接
  • Android 10及以上发起WiFi连接时会弹出系统确认弹窗,用户同意后才会完成连接
  • 若SSID不存在、密码错误、用户拒绝授权都会导致连接失败,需要补充对应异常处理逻辑

内容的提问来源于stack exchange,提问作者Polaris Nation

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 17:45:08