网络建议与推荐:WifiNetworkSuggestion、系统推荐逻辑、第三方 App 集成

各位同学,今天我们来聊一个非常实用的话题——网络建议与推荐。说白了,就是让你的 App 能“告诉”系统:嘿,这个 Wi-Fi 网络不错,你优先连它吧!

这个功能在 Android 10 之后变得特别重要。以前我们还能用 addNetwork 直接往系统里写配置,但后来权限收紧了。嗯,Google 给了我们一个新的 API——WifiNetworkSuggestion。我个人觉得,这个设计其实更合理,也更安全。

什么是 WifiNetworkSuggestion?

简单理解,它就是一份“推荐清单”。你的 App 把想推荐的网络信息打包好,提交给系统。系统会参考这些信息,在合适的时机自动连接。

注意,它不是强制连接。系统有自己的判断逻辑。比如用户已经连着一个网络,信号还不错,那你的推荐可能暂时不会被采纳。

我在项目中遇到过这样的情况:用户装了一个智能家居 App,App 推荐了家里的 Wi-Fi,但用户手机已经连上了公司热点。系统会怎么处理?它会等用户离开公司热点范围后,再尝试连接你推荐的网络。这个逻辑很聪明,对吧?

系统推荐逻辑

系统到底是怎么决定连不连你推荐的网络?我总结了一下,主要有这几个因素:

  • 用户偏好优先:用户手动连接过的网络,优先级永远最高。
  • 信号强度:你推荐的网络信号太弱,系统会等一等。
  • 安全性:开放网络(无密码)的推荐权重会低一些。
  • 推荐者数量:如果有多个 App 推荐同一个网络,系统会更信任它。
  • 时效性:推荐是有有效期的,过期了系统会重新评估。

你想想看,系统其实是在做一道“权衡题”。它既要满足用户的需求,又要保证安全性和体验。所以,我们开发者能做的,就是提供准确、可靠的推荐信息。

核心要点:推荐不是命令,是建议。系统有最终决定权。

第三方 App 如何集成?

好,接下来我们看看代码怎么写。这部分我建议你直接复制我的模板,然后改改参数就行。

首先,你需要创建一个 WifiNetworkSuggestion 对象:

WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder()
    .setSsid("MyHomeWiFi")
    .setWpa2Passphrase("password123")
    .setPriority(5)  // 优先级,数值越大越优先
    .setIsAppInteractionRequired(false)  // 是否需要用户交互
    .build();

然后,把推荐列表提交给系统:

WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
List<WifiNetworkSuggestion> suggestionsList = new ArrayList<>();
suggestionsList.add(suggestion);

int status = wifiManager.addNetworkSuggestions(suggestionsList);
if (status == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
    // 提交成功
} else {
    // 处理失败情况
}

这里有个坑,我曾经踩过。提交推荐需要 CHANGE_WIFI_STATE 权限,而且从 Android 12 开始,还需要 NEARBY_WIFI_DEVICES 权限。别忘了在 Manifest 里声明。

注意:每个 App 最多只能提交 256 个推荐。超过这个数,系统会忽略多余的。我建议你只推荐最常用的几个网络。

推荐的生命周期

推荐不是永久的。系统会定期清理过期的推荐。你可以通过 removeNetworkSuggestions 主动移除:

wifiManager.removeNetworkSuggestions(suggestionsList);

另外,当你的 App 被卸载时,所有推荐会自动清除。这个设计很合理,避免了垃圾数据残留。

实战中的避坑指南

我曾经在一个项目中,发现推荐总是失效。排查了半天,原来是 setIsAppInteractionRequired 设成了 true。这个参数的意思是:连接这个网络需要用户确认。如果你设成 true,系统会弹窗让用户点“连接”,而不是自动连。嗯,这个细节很容易忽略。

还有一次,我同时推荐了多个同名的 SSID(不同频段)。系统会怎么选?它会根据信号强度和优先级综合判断。但如果你不设优先级,系统可能会随机选一个。所以,我建议你明确设置优先级。

SVG 流程图:推荐与连接决策

App 提交推荐列表 系统接收推荐 用户已连接 其他网络? 等待用户断开 检查信号强度 信号足够? 自动连接推荐网络 等待信号变强

这张图展示了从 App 提交推荐到系统最终决策的完整流程。你可以看到,系统会在多个环节做判断,不是一股脑就连接。

总结一下

WifiNetworkSuggestion 是一个很优雅的设计。它让 App 能参与网络选择,但又不会越权。你只需要提供准确的推荐信息,剩下的交给系统。

我个人习惯在 App 启动时检查当前连接的 Wi-Fi 是否在推荐列表里。如果不在,就更新推荐。这样能保证推荐始终是最新的。

好了,这一节的内容就到这里。记住,推荐不是强制的,但好的推荐能大大提升用户体验。

小技巧:如果你的 App 需要连接企业级 Wi-Fi(EAP),记得使用 setEnterpriseConfig() 方法,而不是简单的密码设置。


公众号:蓝海资料掘金营,微信deep3321