Android 10及以上系统如何实现无用户提示的程序化WiFi连接
问题根源
你当前使用的WifiNetworkSpecifier是Android 10(API 29)推出的面向临时WiFi连接场景的API,系统默认设计就需要弹出用户确认弹窗,普通三方应用无特殊权限时无法直接跳过该校验。
可实现无弹窗自动连接的方案如下:
方案1:适配Android 9及以下系统使用
WifiManager系列API
该版本系统无需用户确认即可直接连接WiFi,需先申请以下普通权限:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />替换原有代码为如下逻辑:
WifiConfiguration wifiConfig = new WifiConfiguration(); wifiConfig.SSID = String.format("\"%s\"", SSID); wifiConfig.preSharedKey = String.format("\"%s\"", Password); WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE); // 添加WiFi配置到系统 int netId = wifiManager.addNetwork(wifiConfig); if (netId != -1) { wifiManager.disconnect(); // 切换到目标WiFi wifiManager.enableNetwork(netId, true); wifiManager.reconnect(); }注意:Android 10及以上系统普通三方应用调用
addNetwork会返回-1,该方案仅对API 28及以下生效。方案2:Android 10+ 目标WiFi已保存到系统时直接匹配
如果目标WiFi的密码已经保存在系统已存网络列表中,可删除原有WifiNetworkSpecifier配置,仅通过NetworkRequest指定传输类型为WiFi即可,系统会自动匹配已保存的网络,无需弹出确认框。方案3:Android 10+ 普通应用使用WiFi建议API,仅首次需要用户同意,后续自动连接
使用WifiNetworkSuggestionAPI将目标WiFi添加到系统建议列表,用户首次使用时仅弹出一次确认,后续WiFi在范围内时系统会自动连接,不会再弹提示:WifiNetworkSuggestion suggestion = new WifiNetworkSuggestion.Builder() .setSsid(SSID) .setWpa2Passphrase(Password) .build(); List<WifiNetworkSuggestion> suggestionsList = Collections.singletonList(suggestion); WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); int status = wifiManager.addNetworkSuggestions(suggestionsList); if (status == WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // 建议添加成功,后续自动连接无需确认 }方案4:特殊权限应用完全免弹窗
如果你的应用是系统预装应用、设备管理员应用、与系统签名一致,可申请系统级权限android.permission.NETWORK_SETTINGS,申请后调用原有WifiNetworkSpecifier逻辑不会弹出用户确认框,可以直接自动连接。
内容的提问来源于stack exchange,提问作者Manuel DESTOUESSE

