原文: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 同步方式获取网络类型的更多相关文章

  1. iOS获取网络类型的四种方法

    Reachability类只能区分WIFI和WWAN类型,却无法区分2G网和3G网. 网上也有些方法,却都存在Bug. 经过网上查找资料和测试,基本上总结了以下几种方法: 1.使用导航栏的方式:(私有 ...

  2. 如何在silverlight中以同步方式 获取sharepoint2013站点的当前登录账号

    最近有个项目用到了silverlight要同步方式获取当前登录账号.异步的方式无法跟其他应用结合.主要先后顺序问题.但是silverlight非常不好获取到当前登录账号.即使获取到了也是异步方式获取. ...

  3. iOS:关于获取网络类型和运营商信息

    目录 1. 获取运营商网络类型 2. 获取运营商信息 返回目录 1. 获取运营商网络类型 Apple的Reachability Sample看起来不错,但是只可以判断是否连接到互联网和是否连接Wifi ...

  4. Android 获取网络类型

    获取网络类型 public class IntenetUtil { //没有网络连接 public static final int NETWORN_NONE = 0; //wifi连接 public ...

  5. Android获取网络类型

    public static final String NETWORK_CLASS_UNKNOWN = "unknown"; public static final String N ...

  6. Android检测网络是否可用并获取网络类型

    在类中使用getSystemService的时候需要这样进行使用:1. public class JajaMenu extends Activity { public static JajaMenu ...

  7. Windows Phone 获取网络类型(GSM/CDMA/WIFI/Ethernet)

    一.判断是否有网络数据连接: 最基本的网络状态判断,如果没有网络连接,一切操作都进行不下去啦. Microsoft.Phone.Net.NetworkInformation.NetworkInterf ...

  8. Http方式获取网络数据

    通过以下代码可以根据网址获取网页的html数据,安卓中获取网络数据的时候会用到,而且会用Java中的sax方式解析获取到数据.(sax解析主要是解析xml)具体代码如下: package com.wy ...

  9. Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》

    在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子.在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数 ...

随机推荐

  1. PHP监測memcache服务端的执行状况

    . 代码例如以下,代码为memcache官方代码,引用在此.做一下简单的说明: 1.设置username和password define('ADMIN_USERNAME','admin'); // A ...

  2. 使用Intent启动组件

    android应用程序的三大组件--Activities.Services.Broadcast Receiver,通过消息触发,这个消息就是Intent,中文又翻译为"意图"(我感 ...

  3. eclipse安装ADT后在windows菜单下找不到android SDK and AVD Manager选项的解决办法

    在eclipse中点击window→Customize Perspective→Command Groups availability→Available command groups下勾选Andro ...

  4. _beginThreadex创建多线程解读

    _beginThreadex创建多线程解读 一.须要的头文件支持 #include <process.h>         // for _beginthread() 须要的设置:Proj ...

  5. Python学习入门基础教程(learning Python)--3.1Python的if分支语句

    本节研究一下if分支语句. if分支语句是Python下逻辑条件控制语句,用于条件执行某些语句的控制操作,当if后的条件conditon满足时,if其下的语句块被执行,但当if的控制条件condito ...

  6. codeforece Round#311 BCDE

    B题 给我们n,m ,  m表示茶壶的容量 接下来2*n个数字,表示茶杯的容量,将这些茶杯分给n个男孩和n个女孩 可以倒x毫升的茶水给每个女孩,那么就要倒2x毫升的茶水给男孩,当然了,茶杯要装的下,且 ...

  7. windows phone (18) Border元素

    原文:windows phone (18) Border元素 Border类是对某一个对象的周围边框,背景,或者同时绘制两者,首先看一个简单的例子进行分析[作者:神舟龍] xaml文件: <!- ...

  8. 一些Android框架

    从网上收集一些框架,敲代码偷懒这些框架非常实用,必须记下来,为了以后少写代码,用别人好的框架 ThinkAndroid ThinkAndroid(一个ThinkAndroid教程地址:http://m ...

  9. lua简洁的功能(两)

    Lua中的函数带有词法定界的第一类值. 第一类值: 在Lua中,函数和其它值(数值,字符串)一样,函数能够被存放在变量中,也存放在表中, 能够作为函数的參数,还能够作为函数的返回值. 词法定界:被嵌套 ...

  10. HTML5 在canvas绘制一个矩形

    笔者:本笃庆军 原文地址:http://blog.csdn.net/qingdujun/article/details/32930501 一.绘制矩形 canvas使用原点(0,0)在左上角的坐标系统 ...