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());
}
}
}