使用C#获取Windows Phone手机的各类数据(转)

最近作了一个很黄很暴力的图片应用(只是服务端而已,意思是里面的内容尺度稍微有点大),开发过程还算顺畅,用了AOP和三级缓存,心情不错,因而便想试手Windows Phone开发。开发Windows Phone应用的念头已经好久了,话说个人几个手机都是Windows Phone系统的,不过微软的表现确实不给力。之前也作过一个铃声的应用,只是后来由于设计图不给力就夭折了。html

此次试手也算是Windows Phone开发的开端吧,主要是公司对Windows Phone平台不太看重,整个公司好几个团队,没有一个给Windows Phone作客户端的,谁让市场占有率小呢,没办法的事情。windows

硬件信息

经过Microsoft.Phone.Info命名空间下的DeviceStatus静态类,咱们能够很轻松的获取到Windows Phone设备的硬件信息。好比:制造商、系统内存、设备名称、供电设备、物理键盘等信息。缓存

DeviceStatus类型属性列表
属性名称 说明
ApplicationCurrentMemoryUsage 返回当前应用程序的内存使用状况(以字节为单位)。
ApplicationMemoryUsageLimit 返回您的应用程序进程能够分配的最大内存数量(以字节为单位)。
ApplicationPeakMemoryUsage 返回当前应用程序的高峰内存使用状况(以字节为单位)。
DeviceFirmwareVersion 返回设备上运行的固件版本。
DeviceHardwareVersion 返回设备上运行的硬件版本。
DeviceManufacturer 返回设备制造商名称。
DeviceName 返回设备名称。
DeviceTotalMemory 返回设备的物理 RAM 大小(以字节为单位)。
IsKeyboardDeployed 指示用户是否已部署设备的物理硬件键盘。
IsKeyboardPresent 指示设备是否包含物理硬件键盘。
PowerSource 指示设备当前是以电池电源运行仍是插入了外部电源。

以上信息可参考MSDN:DeviceStatus 类网络

除了上面列出的能够直接取到的信息,有时候还须要获取屏幕分辨率、处理器数量、是否支持GPS、设备标示等信息。post

获取屏幕分辨率ui

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// 获取屏幕分辨率,这样取到的值可能不许确
/// </summary>
/// <returns></returns>
public String GetResolutionRatio()
{
     String val;
     try
     {
         var content = System.Windows.Application.Current.Host.Content;
         val = String.Format( "{0:0}*{1:0}" , content.ActualHeight, content.ActualWidth);
     }
     catch (Exception)
     {
         val = String.Empty;
     }
     return val;
}

获取处理器数量spa

1
System.Environment.ProcessorCount

获取是否支持GPS定位.net

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
/// 获取 是否支持GPS
/// </summary>
/// <returns></returns>
public Boolean GetSupportGeoCoordinateWatcher()
{
     try
     {
         using (var geo = new GeoCoordinateWatcher())
         {
             geo.PositionChanged += null ;
         }
         return true ;
     }
     catch (Exception)
     {
         return false ;
     }
}

获取是否支持FM收音机设计

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
/// 获取 是否支持FM收音机
/// </summary>
/// <returns></returns>
public Boolean GetSupportFmRadio()
{
     try
     {
         return FMRadio.Instance != null ;
     }
     catch (Exception)
     {
         return false ;
     }
}

获取主摄像头信息(包括分辨率)code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// 主摄像头信息
/// </summary>
/// <returns></returns>
public String PrimaryCamera()
{
     if (!Camera.IsCameraTypeSupported(CameraType.Primary)) return ConvertHelper.GetSupportName( false );
     try
     {
         var str = ConvertHelper.GetSupportName( true );
         using (var camera = new PhotoCamera(CameraType.Primary))
         {
             var size = camera.AvailableResolutions.OrderByDescending(i => i.Height * i.Width).First();
             str += String.Format( " [最大分辨率:{0}x{1}]" , size.Width, size.Height);
         }
         return str;
     }
     catch (Exception)
     {
         return ConvertHelper.GetSupportName( true );
     }
}

获取前置像头信息(包括分辨率)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/// <summary>
/// 前置摄像头信息
/// </summary>
/// <returns></returns>
public String FrontFacingCamera()
{
     if (!Camera.IsCameraTypeSupported(CameraType.FrontFacing)) return ConvertHelper.GetSupportName( false );
     try
     {
         var str = ConvertHelper.GetSupportName( true );
         using (var camera = new PhotoCamera(CameraType.FrontFacing))
         {
             var size = camera.AvailableResolutions.OrderByDescending(i => i.Height * i.Width).First();
             str += String.Format( " [最大分辨率:{0}x{1}]" , size.Width, size.Height);
         }
         return str;
     }
     catch (Exception)
     {
         return ConvertHelper.GetSupportName( true );
     }
}

获取是否支持震动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/// <summary>
/// 获取 是否支持振动器
/// </summary>
/// <returns></returns>
public Boolean GetSupportVibrateController()
{
     try
     {
         return VibrateController.Default != null ;
     }
     catch (Exception)
     {
         return false ;
     }
}

获取设备标识

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
private string GetDeviceUniqueId()
{
     var text = String.Empty;
     object obj;
     if (DeviceExtendedProperties.TryGetValue( "DeviceUniqueId" , out obj))
     {
         var data = obj as byte [];
         if (data != null )
         {
             var sb = new StringBuilder(data.Length*2);
             foreach (var b in data)
             {
                 sb.Append(b.ToString( "X2" ));
             }
             text = sb.ToString().Insert(8, "-" ).Insert(17, "-" ).Insert(26, "-" ).Insert(35, "-" );
         }
     }
     return text;
}

系统信息

经过System命名空间下的Environment静态类,能够获取到诸如系统名称、系统版本、CLR版本等信息。详细信息可见MSDN:Environment 类

获取设备上登录的Windows Live 帐号的惟一编号

1
2
3
4
5
6
7
8
9
10
private string GetWindowsLiveAnonymousId()
{
     var result = string .Empty;
     object obj;
     if (UserExtendedProperties.TryGetValue( "ANID" , out obj) && obj != null && obj.ToString().Length >= 34)
     {
         result = obj.ToString().Substring(2, 32).Insert(8, "-" ).Insert(13, "-" ).Insert(18, "-" ).Insert(23, "-" );
     }
     return result;
}

网络信息

设备的联网信息能够用经过命名空间Microsoft.Phone.Net.NetworkInformation下的DeviceNetworkInformation静态类获取到。包括是否使用了WIFI、数据网络、以及网络运营商等。

DeviceNetworkInformation类型属性列表
属性名称 说明
CellularMobileOperator 获取蜂窝移动运营商的名称。
IsCellularDataEnabled 获取一个值,该值指示网络是否启用了蜂窝数据。
IsCellularDataRoamingEnabled 获取一个值,该值指示网络是否容许数据漫游。
IsNetworkAvailable 获取一个值,该值指示网络是否可用。
IsWiFiEnabled 获取一个值,该值指示网络是否启用了 Wi-Fi。

以上信息可参考MSDN : DeviceNetworkInformation 类

开源项目

为了方便之后查代码,我已将项目中的核心代码粘贴在了上面,此次探索的副产物就是一个名为MyPhone的应用,和已上线的“个人手机”应用一模一样。事实上本文的代码在很大程度上参照了这个程序。不过如今Windows Phone 8的程序不太容易反编译了,这对于开发者来讲是一件好事,可是对于我等菜鸟来讲,只能满世界搜代码了……

源码下载:百度网盘

相关文章
相关标签/搜索