xamarin.forms 網絡連接檢測及網絡狀態判斷案例

AndroidManifest.xml文件中加入相應的權限:

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

Android項目:

//監聽器類

[assembly: Dependency(typeof(NetworkConnection))] //的作用是將該類依賴於程序集,以便在可移植平臺底下實例化接口。

namespace XXXXXX.Android
{
    public class NetworkConnection : INetworkConnection
    {
        //沒有網絡
        public  const int NETWORKTYPE_INVALID = 0;
        //wap網絡
        public  const int NETWORKTYPE_WAP = 1;
        //2G網絡
        public const int NETWORKTYPE_2G = 2;
        //3G和3G以上網絡,或統稱爲快速網絡
        public const int NETWORKTYPE_3G = 3;
        //wifi網絡
        public const int NETWORKTYPE_WIFI = 4;
        public bool IsConnected { get; set; }
        //判斷是否有網絡連接
        public void CheckNetworkConnection()
        {
            var connectivityManager = (ConnectivityManager)Android.MainApplication.Context.GetSystemService(Context.ConnectivityService);
            var activeNetworkInfo = connectivityManager.ActiveNetworkInfo;
            if (activeNetworkInfo != null && activeNetworkInfo.IsConnectedOrConnecting)
            {
                IsConnected = true;
            }
            else
            {
                IsConnected = false;
            }
        }
        //檢查啓用了網絡位置提供商報告
        public bool isNetLocEnabled(Context context)
        {
            LocationManager lm = (LocationManager)context.GetSystemService(Context.LocationService);
            return lm.IsProviderEnabled(LocationManager.NetworkProvider);
        }
        //判斷是否有WIFI連接
        public bool isWifiConnected(Context context)
        {
            if (context != null)
            {
                ConnectivityManager mConnectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
                NetworkInfo mWiFiNetworkInfo = mConnectivityManager.GetNetworkInfo(ConnectivityType.Wifi);
                //NetworkInfo mWiFiNetworkInfo = mConnectivityManager.GetNetworkInfo(ConnectivityManager.TYPE_WIFI);
                if (mWiFiNetworkInfo != null)
                {
                    return mWiFiNetworkInfo.IsAvailable;
                }
            }
            return false;
        }
        //判斷Mobile網絡是否可用
        public bool isMobileConnected(Context context)
        {
            if (context != null)
            {
                ConnectivityManager mConnectivityManager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
                NetworkInfo mMobileNetworkInfo = mConnectivityManager.GetNetworkInfo(ConnectivityType.Mobile);
                //NetworkInfo mMobileNetworkInfo = mConnectivityManager.GetNetworkInfo(ConnectivityManager.TYPE_MOBILE);
                if (mMobileNetworkInfo != null)
                {
                    return mMobileNetworkInfo.IsAvailable;
                }
            }
            return false;
        }
        //檢查飛行模式 - 我們要關閉飛機模式
        public bool confirmAirplaneModeOff(Context context)
        {
            int airplaneSetting = Settings.System.GetInt(context.ContentResolver, Settings.System.AirplaneModeOn, 0);
            //int airplaneSetting = Settings.System.getInt(context.getContentResolver(), Settings.System.AIRPLANE_MODE_ON, 0);
            return airplaneSetting == 0;
        }
        //確定網絡位置提供程序是否真的可用
        public bool isNetlocUsable(Context context)
        {
            return isNetLocEnabled(context) && confirmAirplaneModeOff(context) && isWifiConnected(context) && isMobileConnected(context);
        }
        //判斷是否是FastMobileNetWork,將3G或者3G以上的網絡稱爲快速網絡
        private static bool isFastMobileNetwork(Context context)
        {
            TelephonyManager telephonyManager = (TelephonyManager)context.GetSystemService(Context.TelephonyService);
            switch (telephonyManager.NetworkType)
            {
                case NetworkType.OneXrtt:
                    return false; // ~ 50-100 kbps  
                case NetworkType.Cdma:
                    return false; // ~ 14-64 kbps  
                case NetworkType.Edge:
                    return false; // ~ 50-100 kbps  
                case NetworkType.Evdo0:
                    return true; // ~ 400-1000 kbps  
                case NetworkType.EvdoA:
                    return true; // ~ 600-1400 kbps  
                case NetworkType.Gprs:
                    return false; // ~ 100 kbps  
                case NetworkType.Hsdpa:
                    return true; // ~ 2-14 Mbps  
                case NetworkType.Hspa:
                    return true; // ~ 700-1700 kbps  
                case NetworkType.Hsupa:
                    return true; // ~ 1-23 Mbps  
                case NetworkType.Umts:
                    return true; // ~ 400-7000 kbps  
                case NetworkType.Ehrpd:
                    return true; // ~ 1-2 Mbps  
                case NetworkType.EvdoB:
                    return true; // ~ 5 Mbps  
                case NetworkType.Hspap:
                    return true; // ~ 10-20 Mbps  
                case NetworkType.Iden:
                    return false; // ~25 kbps  
                case NetworkType.Lte:
                    return true; // ~ 10+ Mbps  
                case NetworkType.Unknown:
                    return false;
                default:
                    return false;
            }
        }
        //獲取網絡狀態,wifi,wap,2g,3g.
        /// <summary>
        /// context 上下文 
        /// return int 網絡狀態 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G}
        /// {@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@link #NETWORKTYPE_WIFI} 
        /// </summary>
        public static int getNetWorkType(Context context)
        {
            int mNetWorkType = 0;
            ConnectivityManager manager = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
            NetworkInfo networkInfo = manager.ActiveNetworkInfo;


            if (networkInfo != null && networkInfo.IsConnected)
            {
                String type = networkInfo.TypeName;


                if (type.Equals("WIFI".ToUpper()))
                {
                    mNetWorkType = NETWORKTYPE_WIFI;
                }
                else if (type.Equals("MOBILE".ToUpper()))
                {
                    String proxyHost =  Proxy.DefaultHost;
                    //String proxyHost = android.net.Proxy.getDefaultHost();
                    mNetWorkType = TextUtils.IsEmpty(proxyHost) ? (isFastMobileNetwork(context) ? NETWORKTYPE_3G : NETWORKTYPE_2G) : NETWORKTYPE_WAP;
                }
            }
            else
            {
                mNetWorkType = NETWORKTYPE_INVALID;
            }
            return mNetWorkType;
        }
    }
}

iOS項目:

[assembly: Dependency(typeof(NetworkConnection))]
namespace XXXXXX.IPhone
{
    public class NetworkConnection : INetworkConnection
    {
        //public NetworkConnection()
        //{
        //    InternetConnectionStatus();
        //}
        public bool IsConnected { get; set; }
        public void CheckNetworkConnection()
        {
            InternetConnectionStatus();
        }


        private void UpdateNetworkStatus()
        {
            if (InternetConnectionStatus())
            {
                IsConnected = true;
            }
            else if (LocalWifiConnectionStatus())
            {
                IsConnected = true;
            }
            else
            {
                IsConnected = false;
            }
        }


        private event EventHandler ReachabilityChanged;
        private void OnChange(NetworkReachabilityFlags flags)
        {
            var h = ReachabilityChanged;
            if (h != null)
                h(null, EventArgs.Empty);
        }


        private NetworkReachability defaultRouteReachability;
        private bool IsNetworkAvailable(out NetworkReachabilityFlags flags)
        {
            if (defaultRouteReachability == null)
            {
                defaultRouteReachability = new NetworkReachability(new IPAddress(0));
                defaultRouteReachability.SetNotification(OnChange);
                //defaultRouteReachability.SetCallback(OnChange);
                defaultRouteReachability.Schedule(CFRunLoop.Current, CFRunLoop.ModeDefault);
            }
            if (!defaultRouteReachability.TryGetFlags(out flags))
                return false;
            return IsReachableWithoutRequiringConnection(flags);
        }


        private NetworkReachability adHocWiFiNetworkReachability;
        private bool IsAdHocWiFiNetworkAvailable(out NetworkReachabilityFlags flags)
        {
            if (adHocWiFiNetworkReachability == null)
            {
                adHocWiFiNetworkReachability = new NetworkReachability(new IPAddress(new byte[] { 169, 254, 0, 0 }));
                adHocWiFiNetworkReachability.SetNotification(OnChange);
                //adHocWiFiNetworkReachability.SetCallback(OnChange);
                adHocWiFiNetworkReachability.Schedule(CFRunLoop.Current, CFRunLoop.ModeDefault);
            }


            if (!adHocWiFiNetworkReachability.TryGetFlags(out flags))
                return false;


            return IsReachableWithoutRequiringConnection(flags);
        }


        public static bool IsReachableWithoutRequiringConnection(NetworkReachabilityFlags flags)
        {
            // 它是否可以與當前的網絡配置聯繫在一起?
            bool isReachable = (flags & NetworkReachabilityFlags.Reachable) != 0;


            // 我們需要連接來達到它嗎?
            bool noConnectionRequired = (flags & NetworkReachabilityFlags.ConnectionRequired) == 0;


            // 網絡堆棧
            // 檢查
            if ((flags & NetworkReachabilityFlags.IsWWAN) != 0)
                noConnectionRequired = true;


            return isReachable && noConnectionRequired;
        }


        private bool InternetConnectionStatus()
        {
            NetworkReachabilityFlags flags;
            bool defaultNetworkAvailable = IsNetworkAvailable(out flags);
            if (defaultNetworkAvailable && ((flags & NetworkReachabilityFlags.IsDirect) != 0))
            {
                return false;
            }
            else if ((flags & NetworkReachabilityFlags.IsWWAN) != 0)
            {
                return true;
            }
            else if (flags == 0)
            {
                return false;
            }


            return true;
        }


        private bool LocalWifiConnectionStatus()
        {
            NetworkReachabilityFlags flags;
            if (IsAdHocWiFiNetworkAvailable(out flags))
            {
                if ((flags & NetworkReachabilityFlags.IsDirect) != 0)
                    return true;
            }
            return false;
        }
    }
}

(PCL)項目:

接口:

namespace XXXXXX.Cross
{
    public interface INetworkConnection
    {
        bool IsConnected { get; }
        void CheckNetworkConnection();


    }
}

ContentPage頁:

namespace XXXXXX.Cross
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class NetworkPage : ContentPage
    {
        private TapGestureRecognizer ExitTap = new TapGestureRecognizer();
        public NetworkPage()
        {
            InitializeComponent();
            var networkConnection = DependencyService.Get<INetworkConnection>();
            networkConnection.CheckNetworkConnection();
            var networkStatus = networkConnection.IsConnected ? "鏈接" : "未連接";
            var image = new Image
            {
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                HeightRequest = 100,
            };
            var image1 = new Image
            {
                Source = "WiFi.png",
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                HeightRequest = 200,
                WidthRequest = 200
            };
            var message = new Label
            {
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
                Text = DependencyService.Get<INetworkConnection>().IsConnected ? "你已經接通網絡!" : "網絡已斷開!"
            };
            Button refresh = new Button
            {
                Text = "點擊刷新",
                VerticalOptions = LayoutOptions.CenterAndExpand,
                HorizontalOptions = LayoutOptions.CenterAndExpand,
            };


            refresh.Clicked += (sender, e) =>
            {
                try
                {
                    if (DependencyService.Get<INetworkConnection>().IsConnected)
                    {
                        Navigation.PushAsync(new MainPage());
                    }
                    else
                    {
                        Navigation.PushAsync(new NetworkPage());
                        ExitTap.Tapped -= Login_Tapped;
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex.Message);
                    AppCommonUtil.AppUtil.Exit();
                }
            };
            var ContentLayout = new StackLayout
            {
                BackgroundColor = Color.White,
                VerticalOptions = LayoutOptions.Center,
                HorizontalOptions = LayoutOptions.Center
            };
            ContentLayout.Children.Add(image);
            ContentLayout.Children.Add(image1);
            ContentLayout.Children.Add(message);
            ContentLayout.Children.Add(refresh);
            layoutContent.Children.Add(ContentLayout);
        }
        private async void Login_Tapped(object sender, EventArgs e)
        {
            ExitTap.Tapped -= Login_Tapped;
            await Navigation.PushAsync(new NetworkPage());
        }
    }
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章