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
相关产品推荐
相关产品推荐

