App开发经常要判断网络连通情况,并判断网络类型,获取网络IP。xamarin中可以使用Dependencies提供各平台下的方法,现把各平台代码记录如下:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Xamarin.Forms;
using Test.Droid.Dependencies;
using Android.Net;
using Test.Dependencies;
using Java.Net;
using Java.Util;
using Android.Telephony;
using Android.Net.Wifi;
using Org.Apache.Http.Conn.Util; [assembly: Dependency(typeof(NetworkStatusAndroid))]
namespace Test.Droid.Dependencies
{
public class NetworkStatusAndroid : INetworkStatus
{
public bool HasNetwork()
{ //Test(); ConnectivityManager cwjManager = (ConnectivityManager)Android.App.Application.Context.GetSystemService(Context.ConnectivityService);
bool hasNetwork = true;
if (cwjManager.ActiveNetworkInfo != null)
{
hasNetwork = cwjManager.ActiveNetworkInfo.IsAvailable;
}
else
{
hasNetwork = false;
} return hasNetwork;
}
public string GetNetType()
{
return getCurrentNetType(Android.App.Application.Context);
} /// <summary>
/// 获取网络类型
/// </summary>
/// <param name="context"></param>
/// <returns></returns>
public static string getCurrentNetType(Context context)
{
String type = "";
ConnectivityManager cm = (ConnectivityManager)context.GetSystemService(Context.ConnectivityService);
NetworkInfo info = cm.ActiveNetworkInfo;
if (info == null)
{
type = "null";
}
else if (info.Type == ConnectivityType.Wifi)
{
type = "wifi";
}
else if (info.Type == ConnectivityType.Mobile)
{
int subType = (int)info.Subtype;
if (subType == (int)NetworkType.Cdma || subType == (int)NetworkType.Gprs
|| subType == (int)NetworkType.Edge)
{
type = "2g";
}
else if (subType == (int)NetworkType.Umts || subType == (int)NetworkType.Hsdpa
|| subType == (int)NetworkType.EvdoA || subType == (int)NetworkType.Evdo0
|| subType == (int)NetworkType.EvdoB)
{
type = "3g";
}
else if (subType == (int)NetworkType.Lte)
{// LTE是3g到4g的过渡,是3.9G的全球标准
type = "4g";
}
}
return type;
} /// <summary>获取手机wifi
/// </summary>
/// <returns></returns>
public string GetWifiIP()
{
string IP = String.Empty;
Android.Net.Wifi.WifiManager wifi = (Android.Net.Wifi.WifiManager)Forms.Context.GetSystemService(Context.WifiService);
if (wifi.IsWifiEnabled)
{
Android.Net.Wifi.WifiInfo wifiInfo = wifi.ConnectionInfo;
IP = Mixin.Common.StringFormat.intToIp(wifiInfo.IpAddress);
}
return IP;
} /// <summary>
/// 获取手机IP地址
/// </summary>
/// <returns></returns>
public string Test()
{
IEnumeration ie = NetworkInterface.NetworkInterfaces;
while (ie.HasMoreElements)
{
NetworkInterface intf = ie.NextElement() as NetworkInterface;
IEnumeration enumIpAddr = intf.InetAddresses;
while (enumIpAddr.HasMoreElements)
{ InetAddress inetAddress = enumIpAddr.NextElement() as InetAddress; if (!inetAddress.IsLoopbackAddress && (inetAddress as Inet4Address) != null && inetAddress.HostAddress.ToString() != "127.0.0.1")
{
return inetAddress.HostAddress.ToString();
}
}
}
return null;
}
}
}

Android

 using Test.Dependencies;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Windows.Networking.Connectivity;
using Xamarin.Forms; [assembly: Dependency(typeof(Test.UWP.Dependencies.NetworkStatus))]
namespace Test.UWP.Dependencies
{
public class NetworkStatus : INetworkStatus
{
static string None = "None";
static string Unknown = "Unknown";
static string IIG = "2G";
static string IIIG = "3G";
static string IVG = "4G";
static string Wifi = "wifi";
static string Lan = "Lan";
/// <summary>当前应用是否联网
/// </summary>
/// <returns></returns>
public bool HasNetwork()
{
bool isConnected = false; string InternetType = null;
ConnectionProfile profile = NetworkInformation.GetInternetConnectionProfile();
if (profile == null)
{
InternetType = NetworkStatus.None;
}
else
{
NetworkConnectivityLevel cl = profile.GetNetworkConnectivityLevel();
isConnected = (cl != NetworkConnectivityLevel.None);
}
return isConnected;
}
/// <summary>
/// </summary>
/// <returns></returns>
public string GetWifiIP()
{
var icp = NetworkInformation.GetInternetConnectionProfile(); if (icp?.NetworkAdapter == null) return null;
var hostname =
NetworkInformation.GetHostNames()
.SingleOrDefault(
hn =>
hn.IPInformation?.NetworkAdapter != null && hn.IPInformation.NetworkAdapter.NetworkAdapterId
== icp.NetworkAdapter.NetworkAdapterId); // the ip address
return hostname?.CanonicalName;
//return null;
}
/// <summary>
/// 获取UWP连接类型
/// </summary>
/// <returns></returns>
public string GetNetType()
{
bool isConnected = false; string InternetType = null;
ConnectionProfile profile = NetworkInformation.GetInternetConnectionProfile();
if (profile == null)
{
InternetType = NetworkStatus.None;
}
else
{
NetworkConnectivityLevel cl = profile.GetNetworkConnectivityLevel();
isConnected = (cl != NetworkConnectivityLevel.None);
}
if (!isConnected)
{
return NetworkStatus.None;
}
if (profile.IsWwanConnectionProfile)
{
if (profile.WwanConnectionProfileDetails == null)
{
InternetType = NetworkStatus.Unknown;
}
WwanDataClass connectionClass = profile.WwanConnectionProfileDetails.GetCurrentDataClass();
switch (connectionClass)
{
//2G
case WwanDataClass.Edge:
case WwanDataClass.Gprs:
InternetType = NetworkStatus.IIG;
break;
//3G
case WwanDataClass.Cdma1xEvdo:
case WwanDataClass.Cdma1xEvdoRevA:
case WwanDataClass.Cdma1xEvdoRevB:
case WwanDataClass.Cdma1xEvdv:
case WwanDataClass.Cdma1xRtt:
case WwanDataClass.Cdma3xRtt:
case WwanDataClass.CdmaUmb:
case WwanDataClass.Umts:
case WwanDataClass.Hsdpa:
case WwanDataClass.Hsupa:
InternetType = NetworkStatus.IIIG;
break;
//4G
case WwanDataClass.LteAdvanced:
InternetType = NetworkStatus.IVG;
break;
//无网
case WwanDataClass.None:
InternetType = NetworkStatus.Unknown;
break;
case WwanDataClass.Custom:
default:
InternetType = NetworkStatus.Unknown;
break;
}
}
else if (profile.IsWlanConnectionProfile)
{
InternetType = NetworkStatus.Wifi;
}
else
{
///不是Wifi也不是蜂窝数据判断为Lan
InternetType = NetworkStatus.Lan;
}
return InternetType;
}
}
}

UWP

IOS的方法还没写全后面不上,先写一部分

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; using Foundation;
using UIKit;
using Test.iOS.Dependencies;
using Xamarin.Forms;
using Test.Dependencies;
using SystemConfiguration;
using System.Net;
using CoreFoundation;
using ObjCRuntime; [assembly: Dependency(typeof(NetworkStatusIOS))]
namespace Test.iOS.Dependencies
{
public class NetworkStatusIOS : INetworkStatus
{ public bool HasNetwork()
{
//创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
System.Net.IPAddress zeroAddress = System.Net.IPAddress.Parse("0.0.0.0");
bool hasNetWork = false;
NetworkReachability defaultRouteReachability = new NetworkReachability(null, zeroAddress);
NetworkReachabilityFlags flags;
//获得连接的标志
bool didRetrieveFlags = defaultRouteReachability.TryGetFlags(out flags);
if (!didRetrieveFlags)
{
hasNetWork = false;
}
//根据获得的连接标志进行判断
bool isReachable = (flags & NetworkReachabilityFlags.Reachable) == NetworkReachabilityFlags.Reachable;
bool needsConnection = (flags & NetworkReachabilityFlags.ConnectionRequired) == NetworkReachabilityFlags.ConnectionRequired; hasNetWork = (isReachable && !needsConnection); return hasNetWork;
} public string GetWifiIP()
{
//SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); //创建测试连接的引用:
System.Net.IPAddress zeroAddress = System.Net.IPAddress.Parse("0.0.0.0");
NetworkReachabilityFlags flags = NetworkReachabilityFlags.IsLocalAddress;
IsAdHocWiFiNetworkAvailable(out flags);
//NetworkReachability defaultRouteReachability = new NetworkReachability(null, zeroAddress);
//defaultRouteReachability.TryGetFlags return "";
}
public string GetNetType()
{
string strNetworkType = ""; //创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
System.Net.IPAddress zeroAddress = System.Net.IPAddress.Parse("0.0.0.0");
bool hasNetWork = false;
NetworkReachability defaultRouteReachability = new NetworkReachability(null, zeroAddress);
NetworkReachabilityFlags flags;
//获得连接的标志
bool didRetrieveFlags = defaultRouteReachability.TryGetFlags(out flags);
if (!didRetrieveFlags)
{
hasNetWork = false;
} if ((flags & NetworkReachabilityFlags.ConnectionRequired) == )
{
strNetworkType = "WIFI";
}
if (
((flags & NetworkReachabilityFlags.ConnectionOnDemand) != ) ||
(flags & NetworkReachabilityFlags.ConnectionOnTraffic) !=
)
{
if ((flags & NetworkReachabilityFlags.InterventionRequired) == )
{
strNetworkType = "WIFI";
}
} if ((flags & NetworkReachabilityFlags.IsWWAN)==NetworkReachabilityFlags.IsWWAN)
{
if ((float)PlatformName.iOS > )
{
CoreTelephony.CTTelephonyNetworkInfo info = new CoreTelephony.CTTelephonyNetworkInfo();
string currentRadioAccessTechnology = info.CurrentRadioAccessTechnology;
if (!string.IsNullOrEmpty(currentRadioAccessTechnology))
{
if (currentRadioAccessTechnology == "CTRadioAccessTechnologyLTE")
{
strNetworkType = "4G";
}
else if (currentRadioAccessTechnology == "CTRadioAccessTechnologyEdge" ||
currentRadioAccessTechnology == "CTRadioAccessTechnologyGPRS"
)
{
strNetworkType = "2G";
}
else
{
strNetworkType = "3G";
}
}
}
else
{
if ((flags & NetworkReachabilityFlags.Reachable)== NetworkReachabilityFlags.Reachable)
{
if ((flags & NetworkReachabilityFlags.TransientConnection) == NetworkReachabilityFlags.TransientConnection)
{
if ((flags & NetworkReachabilityFlags.ConnectionRequired) == NetworkReachabilityFlags.ConnectionRequired)
{
strNetworkType = "2G";
}
else
{
strNetworkType = "3G";
}
}
}
}
} return strNetworkType;
} #region 方式一
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());
//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[] { , , , }));
//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)
{
// Is it reachable with the current network configuration?
bool isReachable = (flags & NetworkReachabilityFlags.Reachable) != ; // Do we need a connection to reach it?
bool noConnectionRequired = (flags & NetworkReachabilityFlags.ConnectionRequired) == ; // Since the network stack will automatically try to get the WAN up,
// probe that
if ((flags & NetworkReachabilityFlags.IsWWAN) != )
noConnectionRequired = true; return isReachable && noConnectionRequired;
} private bool InternetConnectionStatus()
{
NetworkReachabilityFlags flags;
bool defaultNetworkAvailable = IsNetworkAvailable(out flags);
if (defaultNetworkAvailable && ((flags & NetworkReachabilityFlags.IsDirect) != ))
{
return false;
}
else if ((flags & NetworkReachabilityFlags.IsWWAN) != )
{
return true;
}
else if (flags == )
{
return false;
} return true;
} private bool LocalWifiConnectionStatus()
{
NetworkReachabilityFlags flags;
if (IsAdHocWiFiNetworkAvailable(out flags))
{
if ((flags & NetworkReachabilityFlags.IsDirect) != )
return true;
}
return false;
} #endregion #region 方式二 #endregion
}
}

IOS

xamarin android,UWP 网络类型和IP地址的更多相关文章

  1. JAVA之旅(三十二)——JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用

    JAVA之旅(三十二)--JAVA网络请求,IP地址,TCP/UDP通讯协议概述,Socket,UDP传输,多线程UDP聊天应用 GUI写到一半电脑系统挂了,也就算了,最多GUI还有一个提示框和实例, ...

  2. VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装

    VMware中安装CentOS7网络配置静态IP地址,常用配置和工具安装在阿里云开源镜像地址下载镜像Index of /centos/7.2.1511/isos/x86_64/http://mirro ...

  3. Java知多少(103)网络编程之IP地址和InetAddress类

    Java语言的优势之一是Java程序能访问网络资源.Java提供一系列的类支持Java程序访问网络资源. TCP/IP协议和IP地址 为了进行网络通信,通信双方必须遵守通信协议.目前最广泛使用的是TC ...

  4. 网络基础之IP地址与子网划分

    IP地址 Ipv4地址格式:点分十进制 IP地址的分类 A类 B类 C类: D类:组播 E类: 公共IP地址 私有IP地址 特殊地址 保留地址 子网掩码 什么是子网掩码 CIDR表示法 子网划分 为啥 ...

  5. 网络基础之IP地址和子网掩码

    IP地址 IP是英文Internet Protocol的缩写,意思是"网络之间互连的协议",也就是为计算机网络相互连接进行通信而设计的协议.在因特网中,它是能使连接到网上的所有计算 ...

  6. linux 网络基础之IP地址

    IP是英文Internet Protocol的缩写,意思是“网络之间互连的协议”,也就是为计算机网络相互连接进行通信而设计的协议. IP地址类型分为:公有地址.私有地址. 公有地址 公有地址(Publ ...

  7. 网络协议 2 - IP 地址和 MAC 地址

    了解完网络协议,我们会发现,网络通信的五层模型里,有两个很重要的概念:IP 地址和 MAC 地址. 那么 IP 地址是怎么来的,又是怎么没的?MAC 地址与 IP 地址又有什么区别? 这回答上面问题前 ...

  8. 网络基础之IP地址

    一.IP地址 1.IP地址就是给互联网上每一台主机 (或路由器)每一个接口分配一个在全世界范围内是唯一的32位二进制的地址标识符.现在由互联网名字和数字分配机构ICANN进行分配. 2.转换成十进制 ...

  9. 计算机网络-4-1-2-分类的IP地址

    有关IP最重要的文档就是互联网的正式标准RFC 791 IP地址及其表示方法 整个互联网就是一个单一,抽象的网络,IP地址就是给互联网上的每一台主机(或者路由器)的每一个接口分配一个在全世界范围内都是 ...

随机推荐

  1. 动画requestAnimationFrame

    前言 在研究canvas的2D pixi.js库的时候,其动画的刷新都用requestAnimationFrame替代了setTimeout 或 setInterval 但是jQuery中还是采用了s ...

  2. PhotoView实现图片随手势的放大缩小的效果

    项目需求:在listView的条目中如果有图片,点击条目,实现图片的放大,并且图片可以根据手势来控制图片放大缩小的比例.类似于微信朋友圈中查看好友发布的照片所实现的效果. 思路是这样的:当点击条目的时 ...

  3. PHP之GD函数的使用

    本文讲解常用GD函数的应用 1.一个简单的图像 我们先看一个例子: <?php $w = 200; $h = 200; $img = imagecreatetruecolor($w,$h); $ ...

  4. Solr 排除查询

    前言 solr排除查询也就是我们在数据库和程序中经常处理的不等于,solr的语法是在定语前加[-].. StringBuilder sbHtml=new StringBuilder(); shBhtm ...

  5. C# 自定义控件VS用户控件

    1 自定义控件与用户控件区别 WinForm中, 用户控件(User Control):继承自 UserControl,主要用于开发 Container 控件,Container控件可以添加其他Con ...

  6. PHP设计模式(八)桥接模式(Bridge For PHP)

    一.概述 桥接模式:将两个原本不相关的类结合在一起,然后利用两个类中的方法和属性,输出一份新的结果. 二.案例 1.模拟毛笔(转) 需求:现在需要准备三种粗细(大中小),并且有五种颜色的比 如果使用蜡 ...

  7. Oracle补全日志(Supplemental logging)

    Oracle补全日志(Supplemental logging)特性因其作用的不同可分为以下几种:最小(Minimal),支持所有字段(all),支持主键(primary key),支持唯一键(uni ...

  8. Linux监控工具介绍系列——vmstat

      说来惭愧,玩Linux这么久了,居然没有玩转vmstat这个命令,对很多指标的具体意义都有点模糊不清,花了点时间好好学习.整理一下这个命令的相关资料.因为这个命令确实比较重要,而且频繁用到. 命令 ...

  9. js格式化日期

    /** *对日期进行格式化, * @param date 要格式化的日期 * @param format 进行格式化的模式字符串 * 支持的模式字母有: * y:年, * M:年中的月份(1-12), ...

  10. Git 进阶指南(git ssh keys / reset / rebase / alias / tag / submodule )

    在掌握了基础的 Git 使用 之后,可能会遇到一些常见的问题.以下是猫哥筛选总结的部分常见问题,分享给各位朋友,掌握了这些问题的中的要点之后,git 进阶也就完成了,它包含以下部分: 如何修改 ori ...