如何在应用程序运行时检查连接的网络是否正在连续进行数据通信?

时间:2017-06-01 06:05:17

标签: android xamarin xamarin.android

我的应用程序完全取决于网络,所以我必须检查应用程序和我的服务器之间是否存在数据通信,并且如果没有连接到Wifi或移动数据,并且连接的服务是连接缓慢。 我正在使用以下代码,我可以获得设备是否连接到Wifi或移动数据并获得连接类型,并获得代码以获得连接的移动网络类型,这根本不起作用。 请参考以下代码......

 public void CheckInternet()
        {
            Plugin.Connectivity.CrossConnectivity.Current.ConnectivityChanged += delegate
            {
                if (!(Plugin.Connectivity.CrossConnectivity.Current.IsConnected))
                {
                    StartActivity(typeof(InternetCheckingView));
                }
                if (Plugin.Connectivity.CrossConnectivity.Current.IsConnected)
                {
                    ConnectivityManager connectivityManager = (ConnectivityManager)GetSystemService(ConnectivityService);
                    NetworkInfo networkInf = connectivityManager.ActiveNetworkInfo;
                    bool isOnline = networkInf.IsConnected;
                    NetworkInfo networkInfo = connectivityManager.ActiveNetworkInfo;
                    bool isWifi = networkInfo.Type == ConnectivityType.Wifi;
                    bool isdata = networkInfo.Type == ConnectivityType.Mobile;
                    if (!isOnline)
                    { StartActivity(typeof(InternetCheckingView)); }
                    else if(isWifi)
                    {
                        Toast.MakeText(_context, "Wifi Connected", ToastLength.Short).Show();
                    }
                    else if (isdata)
                    {
                        Toast.MakeText(_context, "Mobile Data Connected", ToastLength.Short).Show();
                        bool datatype = IsConnectionFast(subType);
                        if(!(datatype))
                        {StartActivity(typeof(InternetCheckingView));}
                    }
                }
            };
        }

        public bool IsConnectionFast(object networkType)
        {
            switch (subType)
            {
                //case TelephonyManager.NETWORK_TYPE_1xRTT:
                case NetworkType.OneXrtt:
                    return false; // ~ 50-100 kbps//case TelephonyManager.NETWORK_TYPE_CDMA:
                case NetworkType.Cdma:
                    return false; // ~ 14-64 kbps//case TelephonyManager.NETWORK_TYPE_EDGE:
                case NetworkType.Edge:
                    return false; // ~ 50-100 kbps//case TelephonyManager.NETWORK_TYPE_EVDO_0:
                case NetworkType.Evdo0:
                    return true; // ~ 400-1000 kbps //case TelephonyManager.NETWORK_TYPE_EVDO_A:
                case NetworkType.EvdoA:
                    return true; // ~ 600-1400 kbps//case TelephonyManager.NETWORK_TYPE_GPRS:
                case NetworkType.Gprs:
                    return false; // ~ 100 kbps//case TelephonyManager.NETWORK_TYPE_HSDPA:
                case NetworkType.Hsdpa:
                    return true; // ~ 2-14 Mbps//case TelephonyManager.NETWORK_TYPE_HSPA:
                case NetworkType.Hspa:
                    return true; // ~ 700-1700 kbps//case TelephonyManager.NETWORK_TYPE_HSUPA:
                case NetworkType.Hsupa:
                    return true; // ~ 1-23 Mbps//case TelephonyManager.NETWORK_TYPE_UMTS:
                case NetworkType.Umts:
                    return true; // ~ 400-7000 kbps
                                 /*
                                  * Above API level 7, make sure to set android:targetSdkVersion
                                  * to appropriate level to use these
                                  */
                                 //case TelephonyManager.NETWORK_TYPE_EHRPD: // API level 11
                case NetworkType.Ehrpd:
                    return true; // ~ 1-2 Mbps//case TelephonyManager.NETWORK_TYPE_EVDO_B: // API level 9
                case NetworkType.EvdoB:
                    return true; // ~ 5 Mbps//case TelephonyManager.NETWORK_TYPE_HSPAP: // API level 13
                case NetworkType.Hspap:
                    return true; // ~ 10-20 Mbps//case TelephonyManager.NETWORK_TYPE_IDEN: // API level 8
                case NetworkType.Iden:
                    return false; // ~25 kbps//case TelephonyManager.NETWORK_TYPE_LTE: // API level 11
                case NetworkType.Lte:
                    return true; // ~ 10+ Mbps// Unknown//case TelephonyManager.NETWORK_TYPE_UNKNOWN:
                case NetworkType.Unknown:
                    return false;
                default:
                    return false;
            }
        }

这里我想检测慢速网络,如果这是一个慢速网络,我必须调用StartActivity(typeof(InternetCheckingView))

任何人都可以帮我这样做吗?我希望在没有像onclicklisner这样的数据通信的情况下打开一个弹出窗口,以便即使连接网络时偶数文件管理器也会出现数据丢失/ p>

(添加 - )

我正在通过ping网址来检查数据通信,当网络连接发生变化时,如断开连接或在wifi和移动数据之间发生变化,但我想知道解决方案是在数据通信丢失时获得连接网络的弹出窗口如果仅在应用程序打开时才连接到网络。

0 个答案:

没有答案