Windows Phone 7 - 取得Device相關資訊

Windows Phone 7 - 取得Device相關資訊

在Mango(開發SDK 7.1)釋放了500個以上的API,讓我們開發人員可以控制WP7資源與特性的彈性變大了,

不過500個以上的API實在太多很難一次全部都看完,因此,這一篇就針對目前我自己比較需要的部分進行

撰寫。取得Device Information在很多手機程式裡是非常重要的,尤其是在Android的App可能因為不同的

Android版本在撰寫App時需要特別進行處理,或是在回報錯訊息時透過擷取手機的相關訊息,讓開發人員

可以更快了解在那個版本平台上App才會發生問題。

 

在WP7.1 SDK裡提供了一個重要的API:DeviceStatus API,讓開發者取得Device目前相關的資訊內容,包括:

取得支援的記憶體容量、系統版本、是否支援實體鍵盤等。

 

〉DeviceStatus

該API由7.1 SDK所提供,其API是Microsoft.Phone.Info Namespace,以下來看看該API提供那些設備資訊的存取:

名稱 說明
ApplicationCurrentMemoryUsage 回傳目前Application使用的記憶體容量,以bytes為單位。
ApplicationMemoryUsageLimit 回傳您的Application執行時,可以被允許分配到的最大記憶體容量。
ApplicationPeakMemoryUsage 回傳目前Application使用至高峰時的記憶體容量。
DeviceFirmwareVersion 回傳該Device目前使用的Firmware version。
DeviceHardwareVersion 回傳該Device目前使用的Hardware version。
DeviceManufacturer 取得該Device的製造商名稱。
DeviceName 取得該Device的名稱。
DeviceTotalMemory 回傳該Device的實體RAM大小,以bytes為單位。
IsKeyboardDeployed 識別使用者是否佈署了實體鍵盤於設備上。
IsKeyboardPresent 識別設備是否包括了一個實體鍵盤。
PowerSource 識別目前設備是使用電池模式、充電模式。

針對IsKeyboardDeployed代表目前使用者是否正在使用實體鍵盤的情境,如果需要監聽該事件的話,需要再配合一個重要的事件,

KeyboardDeployedChanged;如果是需要監聽設定是使用電池或充電模式的事件時,需使用PowerSourceChanged來監聽事件。

針對上述列出的API,舉幾個比較接近使用的案例來說明。

 

〉監督記憶體使用狀況

要監督手機的記憶體狀況,可採用這二個關鍵的API:ApplicationCurrentMemoryUsageApplicationPeakMemoryUsage屬性,

可再搭配DeviceTotalMemoryApplicationMemoryUsageLimit屬性來取得Device支援記憶體的大小與App要使用記憶體的限制。

要記得這些記憶體的單位都是回傳bytes,所以(1MB = 1024 KB = 1048576 bytes)要記得做轉換喔。

 

[範例]

   1: //取得該Device提供的記憶體容量
   2: string tTotalMemory = string.Format("Total: {0} MB", (Microsoft.Phone.Info.DeviceStatus.DeviceTotalMemory / 1048576).ToString());
   3: //取得目前使用的App所使用的記憶體容量
   4: string tAppCurrentMemroy = string.Format("Current: {0} MB", (Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage / 1048576).ToString());
   5: //取得目前使用的App最大記憶體容量的限制
   6: string tAppMemoryUsageLimit = string.Format("UsageLimit: {0} MB", (Microsoft.Phone.Info.DeviceStatus.ApplicationMemoryUsageLimit / 1048576).ToString());
   7: //取得目前使用的App在記憶體高鋒時的使用量
   8: string tAppPeakMemory = string.Format("Peak: {0} MB", (Microsoft.Phone.Info.DeviceStatus.ApplicationPeakMemoryUsage / 1048576).ToString());

 

〉識別Keyboard的可用性(實體鍵盤)

目前在市面上具有實體鍵盤的WP7手機蠻少的,DELL有一款之外其他的大廠目前也沒有推出有這樣的造型。

不過還是要了解一下API裡針對實體鍵盤的支援方法。其中有三個重要的屬性與事件監聽:

a. IsKeyboardPresent :確認Device是否本身包括了實體鍵盤(physical hardware keyboard)設備。

b. IsKeyboardDeployed :確認用戶是否佈署(連接)額外的實體鍵盤(physical hardware keyboard)設備。

c. KeyboardDeployedChanged :註冊當用戶佈署(連線)或關閉實體鍵盤時被觸發的事件。

 

〉補捉Device目前是否插上電源的狀態(PowerSource)

識別目前Device是使用何種電源的狀態是蠻常見的案例,例如:需要在充電的情形下才可以更新或下載大量的資料等。

因此,接下來就說明如何識別目前Device使用的電源狀態。

a. Microsoft.Phone.Info.PowerSource與DeviceStatus.PowerSource

    DeviceStatus.PowerSource識別目前設備使用的電源狀態,採用PowerSource列舉值回傳,分成二種:

    a-1. Battery:使用電池;

    a-2. External:使用外接電源;例如:接充電坐、電腦;

b. PowerSourceChanged

    註冊當Device的PowerSource發生改變時所觸發的事件。不過該事件與UI Thread是不同的Thread,要記得加上

    Dispatcher.BeginInvoke()的方法來觸發UI Thread的改變

 

〉實例應用 - App的錯誤回報

這個實例我是舉我之前幫忙實作一個App裡增加的功能,用於當App發出錯誤或效能不好的情形下,可以把當時的狀態

與用戶使用的設備資訊一併捉取出來回報時,可以比較有效協助我們排除問題點。以下簡單列出二個重要的程式片段:

A. 取得重要的設備資訊

   1: public class DeviceInfo
   2: {
   3:     //取得設備所有的資訊
   4:     public bool IsKeyboardDeployed { get { return DeviceStatus.IsKeyboardDeployed; } }
   5:     public bool IsKeyboardPresent { get { return DeviceStatus.IsKeyboardPresent; } }
   6:     public string PowerSource { get { return DeviceStatus.PowerSource.ToString(); } }
   7:     public long ApplicationCurrentMemoryUsage { get { return DeviceStatus.ApplicationCurrentMemoryUsage; } }
   8:     public long ApplicationPeakMemoryUsage { get { return DeviceStatus.ApplicationPeakMemoryUsage; } }
   9:     public long DeviceTotalMemory { get { return DeviceStatus.DeviceTotalMemory; } }
  10:     public string DeviceName { get { return DeviceStatus.DeviceName; } }
  11:     public string DeviceFirmwareVersion { get { return DeviceStatus.DeviceFirmwareVersion; } }
  12:     public string DeviceHardwareVersion { get { return DeviceStatus.DeviceHardwareVersion; } }
  13:     public string DeviceManufacturer { get { return DeviceStatus.DeviceManufacturer; } }
  14:  
  15:     //建立需要回傳的報告格式
  16:     public string GetReport()
  17:     {
  18:         StringBuilder tStringBuilder = new StringBuilder();
  19:         tStringBuilder.Append(string.Format("IsKeyboardDeployed: {0}\r\n", this.IsKeyboardDeployed));
  20:         tStringBuilder.Append(string.Format("IsKeyboardPresent: {0}\r\n", this.IsKeyboardPresent));
  21:         tStringBuilder.Append(string.Format("PowerSource: {0}\r\n", this.PowerSource));
  22:         tStringBuilder.Append(string.Format("ApplicationCurrentMemoryUsage: {0} MB\r\n", this.ApplicationCurrentMemoryUsage));
  23:         tStringBuilder.Append(string.Format("ApplicationPeakMemoryUsage: {0} MB\r\n", this.ApplicationPeakMemoryUsage));
  24:         tStringBuilder.Append(string.Format("DeviceTotalMemory: {0} MB\r\n", this.DeviceTotalMemory));
  25:         tStringBuilder.Append(string.Format("DeviceName: {0}\r\n", this.DeviceName));
  26:         tStringBuilder.Append(string.Format("DeviceFirmwareVersion: {0}\r\n", this.DeviceFirmwareVersion));
  27:         tStringBuilder.Append(string.Format("DeviceHardwareVersion: {0}\r\n", this.DeviceHardwareVersion));
  28:         tStringBuilder.Append(string.Format("DeviceManufacturer: {0}\r\n", this.DeviceManufacturer));
  29:  
  30:         return tStringBuilder.ToString();
  31:     }
  32: }

B. 結合EmailComposeTask發送Mail

   1: EmailComposeTask tMailTask = new EmailComposeTask();
   2: tMailTask.To = "XXXX@live.com";
   3: tMailTask.Subject = "App Error Report";
   4: tMailTask.Body = txtReport.Text;
   5: tMailTask.Show();

 

[補充]

在Mirosoft.Phone.Info的Namespace裡還有包括其他相關的應用API:

a. Microsoft.Phone.Info.DeviceExtendedProperties

   「允許應用程式取得有關該設備的相關資訊」。不過在DeviceStatus API出來之後,這裡提供有些功能在DeviceStatus裡都可以取得。

    以上簡單說明它支援的項目,它是採用GetValue("Property Name")的方式來取得,每一種key取得有不同的值,如下:

屬性名稱 回傳值類型 說明
DeviceManufacturer string,最大256字元 取得設備的manufacturer的名稱,但不是正式的格式需要自訂識別的方式,也有可能是空白。
DeviceName string,最大256字元 取得設備的名稱。但不是正式的格式需要自訂識別的方式,也有可能是空白。
DeviceUniqueId byte array,長度20 取得設備的unique hash。該ID代表設備,不會隨著Rom的更新或重刷而改變。
DeviceFirmwareVersion string 取得firmware的版本號。這跟OS版本沒有關係,如果要取得OS版本需透過System.Environment
DeviceHardwareVersion string 取得Hardware的的版本號。這跟OS版本沒有關係,如果要取得OS版本需透過System.Environment
DeviceTotalMemory long integer 取得設備的實體RAM的大小,以bytes為單位。
ApplicationCurrentMemoryUsage long integer 取得目前Application使用的記憶體大小。
ApplicationPeakMemoryUsage long integer 取得目前Application在最高點的記憶體用量。

    用法如下:

   1: //取得DeviceUniqueID
   2: byte[] tX = DeviceExtendedProperties.GetValue("DeviceUniqueId") as byte[];

    由於使用該類別的話需要存取到用戶的設備資訊,因此,系統會自動提示用戶該Application將會存取他的設備資訊,請參考該

    篇的說明<DeviceExtendedProperties.GetValue Method>。

 

b. Microsoft.Phone.Info.MediaCapabilities

    該類別用於「允許應用程式取得有關該設備執行媒體功能的相關資訊」。有一個重要的屬性「IsMultiResolutionVideoSupported」,

    定義:「識別目前的Device是否支援smooth streaming of multi-resolution encoded video」。用法如下:

   1: //靜態類別,直接使用
   2: bool isSupport = MediaCapabilities.IsMultiResolutionVideoSupported;

 

c. Microsoft.Phone.Info.UserExtendedProperties

   該類別用於「允許應用程式取得有關該設備用戶的anonymous identifier」。用於與DeviceExtendedProperties相似,

   採用GetValue("Property Name")的方式,目前只有支援一個Property Name:ANID。用法如下:

   1: //建議在實體設備測試
   2: string anid = UserExtendedProperties.GetValue("ANID") as string;
   3: string anonymousUserId = anid.Substring(2, 32);

    由於使用該類別的話需要存取到用戶的資訊,因此,系統會自動提示用戶該Application將會存取他的資訊,請參考該

    篇的說明<UserExtendedProperties.GetValue Method>。

 

DispatcherTimer

該類別在Silverlight中常被使用於定期需執行任務的元件,它本身是個timer正常應該是另一個thread的執行,

但卻擁有控制UI Thread的能力,因此非常適合實作於需要定期刷新畫面時的週期觸發元件。使用時,有二個

重要的屬性與事件,直接透過如下的範例來說明:

   1: public void Init()
   2:     DispatcherTimer gTimer = new DispatcherTimer();
   3:     //設定時間週期,TimeSpan時數、分數和秒數)
   4:     gTimer.Interval = new TimeSpan(0, 0, 10);
   5:     //設定週期到時要觸發的事件
   6:     gTimer.Tick += new EventHandler(gTimer_Tick);
   7:     gTimer.Start();
   8: }
   9:  
  10: void gTimer_Tick(object sender, EventArgs e)
  11: {
  12:     MemoryTextBlock.Text = Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage.ToString();
  13:     PeakMemoryTextBlock.Text = Microsoft.Phone.Info.DeviceStatus.ApplicationPeakMemoryUsage.ToString();
  14:     //取得該Device提供的記憶體容量
  15:     string tTotalMemory = string.Format("Total: {0} MB", (Microsoft.Phone.Info.DeviceStatus.DeviceTotalMemory / 1048576).ToString());
  16:     //取得目前使用的App所使用的記憶體容量
  17:     string tAppCurrentMemroy = string.Format("Current: {0} MB", (Microsoft.Phone.Info.DeviceStatus.ApplicationCurrentMemoryUsage / 1048576).ToString());
  18:     //取得目前使用的App最大記憶體容量的限制
  19:     string tAppMemoryUsageLimit = string.Format("UsageLimit: {0} MB", (Microsoft.Phone.Info.DeviceStatus.ApplicationMemoryUsageLimit / 1048576).ToString());
  20:     //取得目前使用的App在記憶體高鋒時的使用量
  21:     string tAppPeakMemory = string.Format("Peak: {0} MB", (Microsoft.Phone.Info.DeviceStatus.ApplicationPeakMemoryUsage / 1048576).ToString());
  22:  
  23:     textBox1.Text = string.Format("{0}\r\n{1}\r\n{2}\r\n{3}\r\n", tTotalMemory, tAppCurrentMemroy, tAppMemoryUsageLimit, tAppPeakMemory);
  24: }

 

======

以上是分享取得WP7上的一些相關資訊,我覺得有些東西還蠻常被使用的。所以把它簡單的做了個簡介,

當作以後要查詢的Index希望有所幫助。謝謝。

 

References:

Device Status for Windows Phone

Retreive the Device Information from Windows Phone

Windows Phone 7 (Mango) Tutorial - 15 - Detecting Device Information(必讀)

How to: Use the DeviceStatus Class for Windows Phone (必讀)

Windows Phone 7 (Mango) Tutoril - 14 - Detecting Network information of the device

Technical Certification Requirements

Getting the device ID as a String on Windows Phone

Application Features for Windows Phone

WP7 Development Tip of the Day: Checking for an internet connection

WP7 check if internet is available

How to check if you have an network connection on WP7?

Using the Data Context for Data Binding

 

Dotblogs Tags: