如何首先在 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 进行第一次连接。然后,在与网络第一次关联后,它就可以工作了。 确保您已添加所需的权限,例如:&lt;uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /&gt; &lt;uses-permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" /&gt; &lt;uses-permission android:name="android.permission.CHANGE_WIFI_STATE" /&gt;。我测试了我这边的代码,它工作正常。 是的,我添加了所需的权限。但是我刚才注意到一件事,在调用 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?的主要内容,如果未能解决你的问题,请参考以下文章

Xamarin.Forms 手势密码实现

在SQL连接期间Xamarin Android应用程序中缺少dll System.Net.Security.Native

如何在 Xamarin.android 中更改条目光标颜色

VS/Xamarin Android开发Follow Me

Xamarin Android - 从图库中选择图像并获取其路径

如何在 Xamarin.Android 中实现 RewardedAdLoadCallback?