如何首先在 Xamarin.Android 中以编程方式连接到特定的 SSID?
Posted
技术标签:
【中文标题】如何首先在 Xamarin.Android 中以编程方式连接到特定的 SSID?【英文标题】:How to first connect to a specific SSID programmatically in Xamarin.Android? 【发布时间】:2021-01-28 18:02:51 【问题描述】:我在以编程方式将我的设备连接到特定 SSID 时遇到问题。 我特别注意到: 如果我手动将设备连接到 SSID(用我的小指向下滑动,胆怯地点击 SSID),那么我连接到该 SSID 的代码就可以工作了。 如果 SSID 是我的设备以前从未连接过的新 SSID,则代码不起作用,但如果手动连接有效。 这太奇怪了,我不知道如何解决。
我正在使用 Xamarin.Forms 和 Xamarin.android,以及 Android 9.0 API 28 - Pie。
有我用来(尝试)连接的代码:
public int ConnectToSSID(string SSID, string password)
var wifiConfiguration = new WifiConfiguration();
wifiConfiguration.Ssid = '"' + SSID + '"';
if (password.Length > 0)
wifiConfiguration.PreSharedKey = '"' + password + '"';
if (wifiManager == null)
wifiManager = (WifiManager)context.GetSystemService(Context.WifiService);
wifiManager.AddNetwork(wifiConfiguration);
IList<WifiConfiguration> list = wifiManager.ConfiguredNetworks;
foreach (WifiConfiguration conf in list)
if (conf.Ssid.Equals('"' + SSID +'"'))
wifiManager.Disconnect();
wifiManager.EnableNetwork(conf.NetworkId, true);
wifiManager.Reconnect();
return 1;
return 0;
【问题讨论】:
【参考方案1】:要以编程方式连接到特定 SSID,请尝试使用以下代码。
string ssid = "\"" + _ssid + "\"";
string password = "\"" + _password + "\"";
var wifiConfig = new WifiConfiguration
Ssid = ssid,
PreSharedKey = password
;
var wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(WifiService);
var addNetwork = wifiManager.AddNetwork(wifiConfig);
var list = wifiManager.ConfiguredNetworks;
foreach (var wifiConfiguration in list)
if (wifiConfiguration.Ssid != null && WifiConfiguration.Ssid.Equals("\"" + _ssid + "\""))
wifiManager.Disconnect();
wifiManager.EnableNetwork(WifiConfiguration.NetworkId, true);
wifiManager.Reconnect();
break;
【讨论】:
不,它不起作用,除非我通过设置 > Wi-Fi > mySSID 进行第一次连接。然后,在与网络第一次关联后,它就可以工作了。 确保您已添加所需的权限,例如:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /> <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
。我测试了我这边的代码,它工作正常。
是的,我添加了所需的权限。但是我刚才注意到一件事,在调用 wifiManager.addNetwork(wifiConfig); 之后我想用记录器亲自检查列表 ConfiguredNetwork,但未添加网络。为什么?
你之前初始化了吗? if (wifiManager == null)
检查wifiManager 实例是否正确。尝试使用以下代码获取 WifiManager。 var wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(WifiService);
我根据您的建议更改了代码并添加了一个日志,现在代码是:'wifiManager = (WifiManager)Android.App.Application.Context.GetSystemService(Context.WifiService); Debug.WriteLine(wifiManager.ToString()); var addNetwork = wifiManager.AddNetwork(wifiConfiguration); Debug.WriteLine("ID == " + addNetwork);'.结果是'[0:] android.net.wifi.WifiManager@18f0dca8 [0:] ID == -1'。所以我认为 AddNetwork 方法失败了。不过非常感谢您的宝贵时间。【参考方案2】:
好的,我知道真正的问题是什么:WifiManager 类无法添加新的 WifiConfiguration。 然后配置从未从 ConfiguredNetworks 列表中选择,也从未连接到它。
要解决这个问题,必须指定我们要连接的 WifiConfiguration 的安全性。
请注意对 API 所做的更改,因为文档建议使用:
WifiConfiguration conf = new WifiConfiguration();
conf.AllowedKeyManagement.Set(WifiConfiguration.[KEY_MANAGEMENT_CONST]);
但这不再起作用了,你必须使用:
WifiConfiguration conf = new WifiConfiguration();
conf.AllowedKeyManagement.Set((int)KeyManagementType.[KEY_MANAGEMENT_CONST]);
现在我的连接方法是:
public int ConnectToSSID(string SSID, string password)
WifiConfiguration wifiConfiguration = new WifiConfiguration();
wifiConfiguration.Ssid = '"' + SSID + '"';
wifiConfiguration.AllowedKeyManagement.Set((int)KeyManagementType.None);
wifiManager = (WifiManager)context.GetSystemService(Context.WifiService);
var addNet = wifiManager.AddNetwork(wifiConfiguration);
if (addNet == -1)
addNet = wifiManager.UpdateNetwork(wifiConfiguration);
if (addNet == -1)
return 0; //Error!
var list = wifiManager.ConfiguredNetworks;
foreach (WifiConfiguration conf in list)
if (conf.Ssid.Equals('"' + SSID + '"'))
wifiManager.Disconnect();
wifiManager.EnableNetwork(conf.NetworkId, true);
wifiManager.Reconnect();
return 1;
return 0;
【讨论】:
以上是关于如何首先在 Xamarin.Android 中以编程方式连接到特定的 SSID?的主要内容,如果未能解决你的问题,请参考以下文章
在SQL连接期间Xamarin Android应用程序中缺少dll System.Net.Security.Native