【问题标题】:Check If Xamarin Android App is connected to one of two networks检查 Xamarin Android 应用程序是否连接到两个网络之一
【发布时间】:2017-04-19 12:28:54
【问题描述】:

我正在编写一个 Xamarin Android 应用程序,我希望能够通过事件了解用户何时从网络(网络 1)跳到另一个网络(网络 2)并在之后处理一些逻辑。我遇到了这个插件https://github.com/jamesmontemagno/ConnectivityPlugin,但问题是,该插件可能会触发网络接口上的事件,我不像 3G 那样监控我不想要这个。我想知道如何实现这一目标?

谢谢

【问题讨论】:

  • 您说的是无线 SSID 的连接变化还是...?
  • 是的,这就是我要说的。即使应用程序获取新 IP 的网络更改
  • 现在您说的是 IP 地址...如果一个新的/不同的 Wifi SSID 连接返回相同的 IP 地址或相同的 IP 子网,或者...您到底想跟踪什么?
  • 我对网络不是很熟悉。我想在我的应用程序中实现的是能够在我的应用程序连接到 wifi 网络 1 或 wifi 网络 2 时通过事件触发器进行检测。我应该如何检测我的 android 应用程序何时连接到任何一个仅限网络

标签: c# networking xamarin network-programming detection


【解决方案1】:

您可以通过 Android BroadcastReceiver 跟踪网络更改,这是一个跟踪 wifi SSIS 更改的快速示例,您可以自定义以满足您的需求。

[BroadcastReceiver]
[IntentFilter(new string[] { WifiManager.NetworkStateChangedAction, WifiManager.WifiStateChangedAction })]
public class NetworkBroadcastReceiver : BroadcastReceiver
{
    readonly WifiManager wifiManager;
    public static string LastSSID;

    public NetworkBroadcastReceiver(IntPtr javaReference, Android.Runtime.JniHandleOwnership transfer) : base(javaReference, transfer)
    {
        wifiManager = (WifiManager)Application.Context.GetSystemService(Context.WifiService);
    }

    public NetworkBroadcastReceiver()
    {
        wifiManager = (WifiManager)Application.Context.GetSystemService(Context.WifiService);
    }

    public override void OnReceive(Context context, Intent intent)
    {
        string currentSSID = null;
        if (WifiManager.NetworkStateChangedAction == intent.Action)
        {
            var netInfo = (NetworkInfo)intent.GetParcelableExtra(WifiManager.ExtraNetworkInfo);
            var netInfoDetailed = netInfo.GetDetailedState();
            if (netInfo.IsConnected || netInfoDetailed == NetworkInfo.DetailedState.Connected) 
            {
                currentSSID = wifiManager.ConnectionInfo.SSID;
            }
            else if (!netInfo.IsConnected)
            {
                currentSSID = null;
            }
        }
        if (WifiManager.WifiStateChangedAction == intent.Action)
        {
            currentSSID = GetCurrentSSID();
        }
        if (LastSSID != currentSSID)
        {
            // Do something on SSID change....
            Toast.MakeText(context, $"Wireless SSID changed, from:{LastSSID} to:{currentSSID}", ToastLength.Long).Show();
            LastSSID = currentSSID;
        }
    }

    public static string GetCurrentSSID()
    {
        var wifiManager = (WifiManager)Application.Context.GetSystemService(Context.WifiService);
        if (wifiManager.ConnectionInfo.SupplicantState == SupplicantState.Completed)
        {
            return wifiManager.ConnectionInfo.SSID;
        }
        return null;
    }
}

注意:确保您拥有向清单添加权限(ACCESS_WIFI_STATEACCESS_NETWORK_STATE

如果需要,您可以在应用启动时通过调用设置初始跟踪 SSID:

NetworkBroadcastReceiver.LastSSID = NetworkBroadcastReceiver.GetCurrentSSID();

或者只是通过以下方式检索当前的 SSID:

var ssid = NetworkBroadcastReceiver.GetCurrentSSID();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多