网络建议与推荐: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 提交推荐到系统最终决策的完整流程。你可以看到,系统会在多个环节做判断,不是一股脑就连接。
总结一下
WifiNetworkSuggestion 是一个很优雅的设计。它让 App 能参与网络选择,但又不会越权。你只需要提供准确的推荐信息,剩下的交给系统。
我个人习惯在 App 启动时检查当前连接的 Wi-Fi 是否在推荐列表里。如果不在,就更新推荐。这样能保证推荐始终是最新的。
好了,这一节的内容就到这里。记住,推荐不是强制的,但好的推荐能大大提升用户体验。
小技巧:如果你的 App 需要连接企业级 Wi-Fi(EAP),记得使用 setEnterpriseConfig() 方法,而不是简单的密码设置。