关于安卓10以上连接wifi无法联网的问题

在Android10之后,应用内连接WiFi的方法不再有效。官方提供的新方式包括使用WifiNetworkSpecifier和NetworkRequest,但在部分国内安卓设备上可能无法正常工作。尝试使用WifiNetworkSuggestion也只是提供连接建议而非保证连接。解决方案包括引导用户手动连接或回退SDK版本。MIUI14已解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连接方式

在Android10之前应用内连接wifi是调用addNetwork和enableNetwork。但在Android10以后以上方法不会生效。

在Android10及以上,官方提供了以下应用内连接wifi的方式:文档

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

但是注意!这段代码在国内的安卓机来说根本没什么鸟用,有些能弹出连接提示框,有些自动给你连接失败,关键是:就算连接成功后,也根本无法访问外部网络。

有人说在networkCallback的onAvailable方法加上

connectivityManager.bindProcessToNetwork(network);

我可以告诉你,一样无效,谷歌和国内的手机厂商没有提供解决方案,可能没重视。

测试过在鸿蒙系统可以做到,但也不稳定。

其他发现

基于以上方案无解,我又看到了一个关于WifiNetworkSuggestion的介绍:

运行 Android 10 (API 级别 29) 或更高版本 的设备允许您的应用添加设备的网络凭据,以自动连接到 WLAN 接入点。您可以使用 WifiNetworkSuggestion 就连接到哪个网络提供建议。平台最终会根据您的应用和其他应用的建议,选择要接受的接入点。

好吧,经过试验,这个只是告诉你我会建议系统连接你的wifi,但并不一定会去连接,所以可以忽略这个方案。

解决方案

1.如果你不是非得校验wifi的正确性,那么弹窗提示用户手动跳转到wifi设置界面,让用户手动连接指定wifi。

val intent = Intent(Settings.ACTION_WIFI_SETTINGS)
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
startActivity(intent)

2.既然是安卓10以上的问题,那么只能不使用10以上的SDK

compileSdkVersion 28
targetSdkVersion 28

这个治标不治本,无可奈何的选择。

后续

经测试MIUI 14系统已经可以支持以上连接wifi的代码,看来手机厂商也在逐步解决这个问题

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猫King

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值