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:ApplicationCurrentMemoryUsage與ApplicationPeakMemoryUsage屬性,
可再搭配DeviceTotalMemory與ApplicationMemoryUsageLimit屬性來取得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:使用外接電源;例如:接充電坐、電腦;
註冊當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>。
該類別在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