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

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

硬件信息

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

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

以上信息可参考MSDN:DeviceStatus 类

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

获取屏幕分辨率

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

获取处理器数量

1
System.Environment.ProcessorCount

获取是否支持GPS定位

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

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

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的程序不太容易反编译了,这对于开发者来说是一件好事,但是对于我等菜鸟来说,只能满世界搜代码了……

源码下载:百度网盘

使用C#获取Windows Phone手机的各种数据(转)的更多相关文章

  1. 获取 Windows Phone 手机系统信息

    wpf: <phone:PhoneApplicationPage x:Class="ABSystemInfo.MainPage" xmlns="http://sch ...

  2. 通过PowerShell获取Windows系统密码Hash

    当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大 ...

  3. [C语言](二)01 获取Windows图形构件大小信息

    SYSMETS.c #include <windows.h> #include "SYSMETS.H"//自定义的单元,所以用"",不是用<& ...

  4. 获取WINDOWS特殊文件夹

    const// registry entries for special paths are kept in :  REGSTR_PATH_SPECIAL_FOLDERS   = REGSTR_PAT ...

  5. VC++ 获取windows系统的版本类型

    vc中获取windows版本信息,一般是调用GetVersionEx 这个API函数来获取的,这个API需要OSVERSIONINFOEX 这个结构体作为参数,OSVERSIONINFOEX 的对应的 ...

  6. qt 获取windows 的消息(通过MFC的DLL的透明窗体转发消息)good

    qt 给win32 发送消息很简单,但是要获取windows 消息却十分复杂,最后想了一个不是很完美 但是也是以现在本人能力所能实现的唯一途径了,基本原理是 利用vc编写一个mfc 的dll ,这个d ...

  7. 几个获取Windows系统信息的Delphi程序

    1.获取windows版本信息 可以通过Windows API函数GetVersionEx来获得. 具体程序如下: Procedure Tform1.Button1Click(sender:TObje ...

  8. 获取Windows系统中的所有可用和在用串口

    目的:获取Windows系统中的所有可用和在用串口 方法:注册表查询法 优点:简单.实用.快速.无遗漏,无多余结果. 说明:另外还有8种方法可以枚举串口,但都不如此法. 代码和详细注释如下: //-- ...

  9. Python使用wmi获取Windows相关信息

    在使用Python获取Windows系统上的相关的信息可以使用WMI接口来获取, 什么是wmi? WMI是一项核心的Windows管理技术,WMI作为一种规范和基础结构,通过它可以访问.配置.管理和监 ...

随机推荐

  1. git第五节--git branch--分支管理

    @git branch :查看当前仓库所有分支,及当前所处的分支 @git branch XXX:创建分支XXX @git checkout XXX:切换到分支XXX下 @git checkout - ...

  2. win10 磁盘占用高--- 禁用用户改善反馈 CompatTelRunner.exe

    1. 2.右键点开[这台电脑],点[管理],点[服务和应用程序]点[服务],在右边框里把[superfetch] [windows search][HomeGroupListener] [HomeGr ...

  3. 并发编程之 Semaphore 源码分析

    前言 并发 JUC 包提供了很多工具类,比如之前说的 CountDownLatch,CyclicBarrier ,今天说说这个 Semaphore--信号量,关于他的使用请查看往期文章并发编程之 线程 ...

  4. WPF文字修饰——上、中、下划线与基线

    我们知道,文字的修饰包括:空心字.立体字.划线字.阴影字.加粗.倾斜等.这里只说划线字的修饰方式,按划线的位置,我们可将之分为:上划线.中划线.基线与下划线.如图: 从上至下,分别为上划线(Overl ...

  5. 9.C#知识点:线程初识及Thread初识(一)

    知识点目录==========>传送门 线程和进程的简单概括. 1.进程就是"活动中"的程序,一个.程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实 ...

  6. 数据结构与算法--最短路径之Floyd算法

    数据结构与算法--最短路径之Floyd算法 我们知道Dijkstra算法只能解决单源最短路径问题,且要求边上的权重都是非负的.有没有办法解决任意起点到任意顶点的最短路径问题呢?如果用Dijkstra算 ...

  7. 【Linux】 源码安装make命令详解,避免踩坑

    正常的编译安装/卸载: 源码的安装一般由3个步骤组成:配置(configure).编译(make).安装(make install).   configure文件是一个可执行的脚本文件,它有很多选项, ...

  8. 随机错乱排序(sort的应用)

    新手上路,大家多多指教哈,,, #include <iostream> #include <algorithm> #include <ctime> using na ...

  9. 深入浅出Mybatis技术原理与实战(杨开振)(带详细书签) PDF 下载 高清 完整版+源码

    (杨开振) 源码 IDE eclipse 建表语句也在里面 电子书+源码地址

  10. POJ3159(KB4-K 差分约束)

    Candies Time Limit: 1500MS   Memory Limit: 131072K Total Submissions: 33283   Accepted: 9334 Descrip ...