Xamarin开发Android9三星Galaxy S8调用AddNetwork返回-1如何解决
三星Galaxy S8搭载的安卓9版本(One UI 1.x)对WifiConfiguration的参数校验逻辑比原生安卓严格很多,冗余的不匹配加密参数、缺失权限、已有重复配置都会导致AddNetwork直接返回-1。以下是可落地的修复方案:
- 精简
WifiConfiguration参数,仅保留目标WiFi实际使用的配置项,不要加入当前安卓版本不支持或者当前网络不需要的参数。安卓9原生不支持WPA3的SAE加密,额外添加KeyManagementType.Sae、WEP相关参数会触发三星的参数校验拦截。
修改后的代码示例如下:
var config = new WifiConfiguration(); config.Ssid = "\"" + ssid + "\""; config.PreSharedKey = "\"" + password + "\""; // 仅保留WPA/WPA2 PSK所需的基础参数 config.AllowedAuthAlgorithms.Set((int)AuthAlgorithmType.Open); config.AllowedProtocols.Set((int)ProtocolType.Wpa); config.AllowedProtocols.Set((int)ProtocolType.Rsn); config.AllowedKeyManagement.Set((int)KeyManagementType.WpaPsk); config.AllowedPairwiseCiphers.Set((int)PairwiseCipherType.Tkip); config.AllowedPairwiseCiphers.Set((int)PairwiseCipherType.Ccmp); config.AllowedGroupCiphers.Set((int)GroupCipherType.Tkip); config.AllowedGroupCiphers.Set((int)GroupCipherType.Ccmp); // 添加前先移除已存在的同SSID配置 var existingNetworks = WifiManager.ConfiguredNetworks; if (existingNetworks != null) { foreach (var existing in existingNetworks) { if (existing.Ssid == config.Ssid) { WifiManager.RemoveNetwork(existing.NetworkId); } } } var addReturn = WifiManager.AddNetwork(config); if (addReturn != -1) { // 三星设备必须显式调用保存配置 WifiManager.SaveConfiguration(); // 可选:立即连接该网络 WifiManager.Disconnect(); WifiManager.EnableNetwork(addReturn, true); WifiManager.Reconnect(); }
- 确保已经动态申请了位置权限。安卓9要求连接WiFi必须获取
ACCESS_FINE_LOCATION运行时权限,三星对权限校验更严格,仅在AndroidManifest.xml静态声明权限会导致AddNetwork返回-1,必须在调用接口前弹窗申请用户授权。 - 检查应用是否被三星系统的智能管理器、权限管理禁用了WiFi相关权限,部分三星设备会默认禁止第三方应用修改WiFi配置,可引导用户到应用权限设置页开启「更改WiFi状态」「位置信息」权限后重试。
内容的提问来源于stack exchange,提问作者Tomohisa Takaoka
相关产品推荐
相关产品推荐

