【问题标题】:How to get the connected SSID in Xamarin.Forms?如何在 Xamarin.Forms 中获取连接的 SSID?
【发布时间】:2020-06-14 14:13:27
【问题描述】:

我需要获取当前连接到的网络的SSID

这是我用来在 Xamarin.Android 中查找 SSID 的代码:

WifiManager wifiManager = (WifiManager)(Application.Context.GetSystemService(WifiService));

if (wifiManager != null)
{
    var ssid =  wifiManager.ConnectionInfo.SSID;
}
else
{
    var str =  "WiFiManager is NULL";
}

但我需要在 Xamarin.Forms 中实现这一点。

我该怎么做?

【问题讨论】:

  • 对不起,在我的 anwser 上我说 Dependency(typeof()) 是 IGetSSID,这是不正确的,我已经更新了我的 anwser,它是 Dependency(typeof(GetSSIDAndroid))

标签: c# xamarin.forms xamarin.android wifi ssid


【解决方案1】:

您可以使用DependencyService

DependencyService 类是一个服务定位器,它使 Xamarin.Forms 应用程序能够从共享代码调用本机平台功能。

创建一个公共接口(为了组织,可能在Mobile > Services > IGetSSID下)

public interface IGetSSID
{
    string GetSSID();
}

创建 Android 实现

[assembly: Dependency(typeof(GetSSIDAndroid))]
namespace yournamespace
{
    public class GetSSIDAndroid : IGetSSID
    {
        public string GetSSID()
        {
            WifiManager wifiManager = (WifiManager)(Android.App.Application.Context.GetSystemService(Context.WifiService));

            if (wifiManager != null && !string.IsNullOrEmpty(wifiManager.ConnectionInfo.SSID))
            {
                return wifiManager.ConnectionInfo.SSID;
            }
            else
            {
                return "WiFiManager is NULL";
            }
        }
    }
}

然后在你的表单中你会得到这样的 SSID:

var ssid = DependencyService.Get<IGetSSID>().GetSSID();

注意:不要忘记在您的 Android 清单中添加此权限

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

【讨论】:

  • 谢谢!你有没有机会知道一个干净的方式来为 iOS 获取这个?
  • @David 我找到了这个SO Post,遵循 iOS 的相同逻辑,我相信你可以实现它,如果需要,我可以更新我的 awnser 以包含它。
  • 请原谅我的文盲,但我如何才能访问 WifiManager
  • 它告诉我 NullReferenceException,在步骤 3°
  • @BluePrint 你在哪里使用ssid = DependencyService.Get&lt;IGetSSID&gt;().GetSSID(); 部分?
【解决方案2】:

获取 SSID 和 BSSID API31 Xamarin C# 示例

所需权限:CHANGE_NETWORK_STATE、ACCESS_FINE_LOCATION

如果 APITransportInfo 将返回 Null

using Android.Content;
using Android.Net;
using Android.Net.Wifi;

protected override void OnStart()
    {
        base.OnStart();

        NetworkRequest request = new NetworkRequest.Builder().AddTransportType(transportType: TransportType.Wifi).Build();
        ConnectivityManager connectivityManager = Android.App.Application.Context.GetSystemService(Context.ConnectivityService) as ConnectivityManager;

        NetworkCallbackFlags flagIncludeLocationInfo = NetworkCallbackFlags.IncludeLocationInfo;
        NetworkCallback networkCallback = new NetworkCallback((int)flagIncludeLocationInfo);
        connectivityManager.RequestNetwork(request, networkCallback);
    }

    private class NetworkCallback : ConnectivityManager.NetworkCallback
    {
        public NetworkCallback(int flags) : base(flags)
        {
        }

        public override void OnCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities)
        {
            base.OnCapabilitiesChanged(network, networkCapabilities);
            WifiInfo wifiInfo = (WifiInfo)networkCapabilities.TransportInfo;

            if (wifiInfo != null)
            {
                string ssid = wifiInfo.SSID.Trim(new char[] {'"', '\"' });
                string bssid = wifiInfo.BSSID;
            }
        }
    }

点击Android API reference.ConnectivityManager.NetworkCallback(int)

【讨论】:

  • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2021-02-05
  • 2014-02-18
  • 1970-01-01
  • 2019-03-01
  • 2014-10-06
  • 2020-02-20
  • 2011-06-08
  • 2021-04-11
相关资源
最近更新 更多