Windows Phone 同步方式获取网络类型
在Windows Phone 开发中有时候需要获取设备当前连接网络的类型,是Wifi,还是2G,3G,或者4G,SDK中提供获取网络类型的API(Microsoft.Phone.Net.NetworkInformation. DeviceNetworkInformation),通过此API我们可以方便的获取相关信息。但是此API是基于异步回调的方式获取的,如果需要同步获取,那么就需要做一些特殊的处理。
以下代码定义网络类型信息类,用于存储获取的网络类型信息。
/// <summary>
/// 网络类型
/// </summary>
public enum NetworkType
{
None = ,
Wifi = , //Wifi
Mobile2G = , //2G网络
Mobile3G = , //3G网络
Mobile4G = //4G网络
} /// <summary>
/// 网络类型信息
/// </summary>
public class NetworkInfo
{
/// <summary>
/// 网络接口的名称
/// </summary>
public string InterfaceName { get; set; } /// <summary>
/// 网络接口的说明
/// </summary>
public string Description { get; set; } /// <summary>
/// 网络类型
/// </summary>
public NetworkType InterfaceType { get; set; }
}
以下代码将从系统NetworkInterfaceInfo解析获取网络类型信息并写入到上面构造的NetworkInfo类中。
private static NetworkInfo parseNetworkInfo(NetworkInterfaceInfo info)
{
NetworkInfo netInfo = new NetworkInfo();
if (info != null)
{
netInfo.InterfaceName = info.InterfaceName;
netInfo.Description = info.Description;
switch (info.InterfaceType)
{
case NetworkInterfaceType.MobileBroadbandCdma:
case NetworkInterfaceType.MobileBroadbandGsm:
switch (info.InterfaceSubtype)
{
case NetworkInterfaceSubType.Cellular_GPRS:
case NetworkInterfaceSubType.Cellular_1XRTT:
case NetworkInterfaceSubType.Cellular_EDGE:
netInfo.InterfaceType = NetworkType.Mobile2G;
break;
case NetworkInterfaceSubType.Cellular_3G:
case NetworkInterfaceSubType.Cellular_EVDO:
case NetworkInterfaceSubType.Cellular_EVDV:
case NetworkInterfaceSubType.Cellular_HSPA:
netInfo.InterfaceType = NetworkType.Mobile3G;
break;
case NetworkInterfaceSubType.Cellular_LTE:
case NetworkInterfaceSubType.Cellular_EHRPD:
netInfo.InterfaceType = NetworkType.Mobile4G;
break;
default:
netInfo.InterfaceType = NetworkType.None;
break;
}
break;
case NetworkInterfaceType.Wireless80211:
netInfo.InterfaceType = NetworkType.Wifi;
break;
default:
netInfo.InterfaceType = NetworkType.None;
break;
}
}
return netInfo;
}
关于NetworkInterfaceInfo. NetworkInterfaceSubType的各种网络类型的说明给出以下表格:
|
网络类型 |
说明 |
|
Unknown |
没有有关网络接口类型的其他信息。 |
|
Cellular_GPRS |
使用通用分组无线业务 (General Packet Radio Service, GPRS) 蜂窝技术的网络接口。这是 2.5G 技术。 |
|
Cellular_1XRTT |
使用无线传输技术 (Radio Transmission Technology, 1xRTT) 蜂窝技术的网络接口。这是 2.5G 技术。 |
|
Cellular_EVDO |
Evolution Data Only (EV-DO) 蜂窝技术的网络接口。这是 3G 技术。 |
|
Cellular_EDGE |
使用增强型数据速率 GSM 演进 (Enhanced Data rates for GSM Evolution, EDGE) 蜂窝技术的网络接口。这是2.5G 技术。 |
|
Cellular_3G |
使用第三代 (3G) 蜂窝技术的网络接口。 |
|
Cellular_HSPA |
使用高速下行分组接入 (High-Speed Downlink Packet Access, HSPA) 蜂窝技术的网络接口。这是 3.5G 技术。 |
|
Cellular_EVDV |
使用数据和语音演进 (Evolution Data and Voice, EV-DV) 蜂窝技术的网络接口。这是 3G 技术。 |
|
Desktop_PassThru |
桌面 pass- through 网络接口。 |
|
WiFi |
使用无线技术 (802.11) 的网络接口。 |
|
Cellular_LTE |
使用长期进化 (Long Term Evolution,LTE) 蜂窝技术的网络接口。这是 4G 技术。 |
|
Cellular_EHRPD |
使用增强型高速率数据包 (Enhanced High Rate Packet Data,EHRPD) 蜂窝技术的网络接口。这是 4G 技术。 |
下面给出通过回调的方式获取网络类型信息的实现方式。
public static NetworkInfo NetInfo = null;
public static void getNetworkType()
{
DeviceNetworkInformation.ResolveHostNameAsync(
new DnsEndPoint("www.microsoft.com", ),
new NameResolutionCallback(handle =>
{
NetworkInterfaceInfo info = handle.NetworkInterface;
NetInfo = parseNetworkInfo(info);
}), null);
}
下面给出如何将基于异步回调的方式转换为同步方式来获取网络类型信息,此种转换方式不仅仅只用于此处,对于所有的基于异步回调的处理都可以安装此种处理来转换成同步获取。实例代码如下:
public static async Task<NetworkInfo> getNetworkTypeAsync()
{
NetworkInfo result = await Task.Factory.StartNew<NetworkInfo>(() =>
{
NetworkInfo netInfo = null;
EventWaitHandle Wait = new AutoResetEvent(false);
DeviceNetworkInformation.ResolveHostNameAsync(
new DnsEndPoint("www.microsoft.com", ),
new NameResolutionCallback(handle =>
{
NetworkInterfaceInfo info = handle.NetworkInterface;
netInfo = parseNetworkInfo(info);
Wait.Set(); }), null);
Wait.WaitOne();
return netInfo;
});
return result;
}
Windows Phone 同步方式获取网络类型的更多相关文章
- iOS获取网络类型的四种方法
Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有 ...
- 如何在silverlight中以同步方式 获取sharepoint2013站点的当前登录账号
最近有个项目用到了silverlight要同步方式获取当前登录账号.异步的方式无法跟其他应用结合.主要先后顺序问题.但是silverlight非常不好获取到当前登录账号.即使获取到了也是异步方式获取. ...
- iOS:关于获取网络类型和运营商信息
目录 1. 获取运营商网络类型 2. 获取运营商信息 返回目录 1. 获取运营商网络类型 Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi ...
- Android 获取网络类型
获取网络类型 public class IntenetUtil { //没有网络连接 public static final int NETWORN_NONE = 0; //wifi连接 public ...
- Android获取网络类型
public static final String NETWORK_CLASS_UNKNOWN = "unknown"; public static final String N ...
- Android检测网络是否可用并获取网络类型
在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu ...
- Windows Phone 获取网络类型(GSM/CDMA/WIFI/Ethernet)
一.判断是否有网络数据连接: 最基本的网络状态判断,如果没有网络连接,一切操作都进行不下去啦. Microsoft.Phone.Net.NetworkInformation.NetworkInterf ...
- Http方式获取网络数据
通过以下代码可以根据网址获取网页的html数据,安卓中获取网络数据的时候会用到,而且会用Java中的sax方式解析获取到数据.(sax解析主要是解析xml)具体代码如下: package com.wy ...
- Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》
在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子.在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数 ...
随机推荐
- eclipse failed to create the java virtual machine 问题图文解析(转)
clipse failed to create the java virtual machine 解决方法: 1.问题现象 2.java虚拟机初始化失败!寻找eclipse解压路径 3.寻找ecl ...
- poj3237(树链剖分)
题目链接:http://poj.org/problem?id=3237 题目大意:指定一颗树上有3个操作: 1)询问操作,询问a点和b点之间的路径上最长的那条边的长度(即最大值): 2)取反操作,将a ...
- orcl 删除重复的行
delete from FOODDETAIL t where t.id in (select t.id from FOODDETAIL where t.sendtime>=to_date(' ...
- Git管理工具对照(GitBash、EGit、SourceTree)
Git管理工具对照(GitBash.EGit.SourceTree) GitBash是採用命令行的方式对版本号进行管理,功能最为灵活强大,可是由于须要手动输入希望改动的文件名称,所以相对繁琐. EGi ...
- C#区域截图——调用API截图
原文:C#区域截图——调用API截图 前言:截图对于一个C++开发者来说无非是小菜一碟,也有朋友使用C#的 Graphics.CopyFromScreen 方法屏幕操作,作为一名整天想着用 C++ 开 ...
- ASP.NET关于Login控件使用,LoginView 控件,CreateUserWizard 控件
原文:ASP.NET关于Login控件使用,LoginView 控件,CreateUserWizard 控件 Login控件它是属于Membership服务的一部分,必须配置Membership提供程 ...
- 经常使用的正則表達式归纳—JavaScript正則表達式
来源:http://www.ido321.com/856.html 1.正则优先级 首先看一下正則表達式的优先级,下表从最高优先级到最低优先级列出各种正則表達式操作符的优先权顺序: 2.经常使用的正則 ...
- android uiautomator自己主动化測试
前提是自己电脑上配置好JDK,android和ant的环境 1.命令行下进入\Android-sdk\tools\文件夹下,执行命令: android list 查看相应android版本 ...
- JS创建 trim() 方法,此方法在IE7、IE8中不存在 需要自定义
function trim(str){ //创建空格对象 var space = new String(" "); /* str = trimLeft(str,space); st ...
- ACM:回溯,八皇后问题,素数环
(一)八皇后问题 (1)回溯 #include <iostream> #include <string> #define MAXN 100 using namespace st ...