使用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的程序不太容易反編譯了,這對於開發者來講是一件好事,可是對於我等菜鳥來講,只能滿世界搜代碼了……

源碼下載:百度網盤

相關文章
相關標籤/搜索