在 Windows Phone 7 中有些功能必須透過 Task 才能達成。
(本文同步發表於 http://blog.tonycube.com )
在 Windows Phone 7 中有些功能必須透過 Task 才能達成。
§ Task
在 Windows Phone 中不能直接操作像是簡訊(SMS)、打電話(Phone)、收發Email及使用相機等功能,必須透過 Task 來呼叫系統的相關任務來執行上述的功能。當 Task 被呼叫使用時,本身的App會進入 tombstone 的狀態,所以記得要預做保留資料的動作。使用時必須引用的命名空間:Microsoft.Phone.Task。
Task 分為兩類:一個是 Chooser (選擇器),一個是 Launcher (啟動器)。 兩者只有簡單的差別,選擇器會去選擇某個資料後傳回;啟動器則是去執行該任務,完成後就結束並回到原App。
Chooser:
- CameraCaptureTask
- EmailAddressChooserTask
- PhoneNumberChooserTask
- PhotoChooserTask
- SaveEmailAddressTask
- SavePhoneNumberTask
Launcher:
- EmailComposeTask
- PhoneCallTask
- SerachTask
- SmscomposeTask
- WebBrowserTask
- MediaPlayerLanucher
- MarketPlaceDetailTask
- MarketplaceHubTask
- MarketplaceReviewTask
- MarketPlaceSearchTask
※Chooser
使用上的注意事項,在MSDN上的說明,建議將 Chooser 設為全域變數,初始化及事件註冊的的動作也建議都在 PhoneApplicationPage 的建構式 ( 在InitializeComponent() 方法之後 ) 中去完成,因為 Windows Phone 一次只會執行一支程式,當使用 Chooser 或 Launcher 時,原本的程式將會被暫停,要注意資料保存的問題。
● CameraCaptureTask
打開相機拍照,並取得照片。
此範例用到一個按鈕及一個 Image 控制項。按下拍照按鈕(左上圖)後,會啟動相機(右上圖),在模擬器畫面中是一片黑,按下右上角的拍照鈕,會出現拍照所取得的照片(左下圖),並且尋問是否接受此照片,若按下接受,會回傳影像 stream 給原呼叫的程式,我們將它顯示在 Image 控制項中 (右下圖)。
程式碼如下:
要先引用
using Microsoft.Phone.Tasks; using System.Windows.Media.Imaging;
這兩個命名空間。
namespace HelloWindowsPhone { public partial class MainPage : PhoneApplicationPage { //以全域方式建立變數 CameraCaptureTask camera; // 建構函式 public MainPage() { InitializeComponent(); //產生物件及註冊完成事件 camera = new CameraCaptureTask(); camera.Completed += new EventHandler<PhotoResult>(camera_completed); } private void button1_Click(object sender, RoutedEventArgs e) { //啟動相機 camera.Show(); } private void camera_completed(object sender, PhotoResult e) { //依使用者選擇做處理 if (e.TaskResult == TaskResult.OK) { BitmapImage bmp = new BitmapImage(); bmp.SetSource(e.ChosenPhoto); image1.Source = bmp; } else { image1.Source = null; } } } }
● EmailAddressChooserTask 取得連絡人的 Email 。
此範例用到一個按鈕及一個文字欄位(左上圖)。按下 Email 按鈕,切換到連絡人清單(右上圖),點選任一連絡人後傳回此人的 Email 並顯示在文字欄位(左下圖)。
程式碼如下:
namespace HelloWindowsPhone { public partial class MainPage : PhoneApplicationPage { //以全域方式建立變數 EmailAddressChooserTask email; // 建構函式 public MainPage() { InitializeComponent(); //產生物件及註冊完成事件 email = new EmailAddressChooserTask(); email.Completed += new EventHandler<EmailResult>(email_Completed); } private void button1_Click(object sender, RoutedEventArgs e) { email.Show(); } private void email_Completed(object sender, EmailResult e) { if (e.TaskResult == TaskResult.OK) { textBlock1.Text = e.Email; } } } }
● PhoneNumberChooserTask
取得連絡人的電話號碼。
此範例和取 Email 相同。按下 Phone 按鈕後切換到連絡人清單,取回選擇的連絡人的電話號碼(如上圖)。
程式碼如下:
namespace HelloWindowsPhone { public partial class MainPage : PhoneApplicationPage { //以全域方式建立變數 PhoneNumberChooserTask phoneNumber; // 建構函式 public MainPage() { InitializeComponent(); //產生物件及註冊完成事件 phoneNumber = new PhoneNumberChooserTask(); phoneNumber.Completed += new EventHandler<PhoneNumberResult>(phoneNumber_Completed); } private void button1_Click(object sender, RoutedEventArgs e) { phoneNumber.Show(); } private void phoneNumber_Completed(object sender, PhoneNumberResult e) { if (e.TaskResult == TaskResult.OK) { textBlock1.Text = e.PhoneNumber; } } } }
● PhotoChooserTask
取得手機中的圖片。
此範例用到一個按鈕及 Image 控制項(左上圖)。按下 Photo 按鈕切換到相簿(右上圖),選擇一個相簿進入後列出全部相片(左下圖),選擇其中一張相片後傳回(右下圖)。 另外,如下圖左,你可以設定是否讓相機成為圖片來源,當你啟用此功能時,會在 Application Bar 中出現相機的按鈕,使用相機拍照所得到的相片。 你還可以對取得的圖片做裁切,當你設定圖片的尺寸時,在選取圖片的同時會出現一個裁切框,按下下方的打勾鈕後,傳回裁切過的圖片(下圖右)。
程式碼如下:
namespace HelloWindowsPhone { public partial class MainPage : PhoneApplicationPage { //以全域方式建立變數 PhotoChooserTask photo; // 建構函式 public MainPage() { InitializeComponent(); //產生物件及註冊完成事件 photo = new PhotoChooserTask(); photo.Completed += new EventHandler<PhotoResult>(photo_Completed); } private void button1_Click(object sender, RoutedEventArgs e) { //若要裁切相片,可以設定裁切後的尺寸 //photo.PixelHeight = 200; //photo.PixelWidth = 480; //若要使用相機,可以設定出現拍照的按鈕(位於 Application Bar) //photo.ShowCamera = true; photo.Show(); } private void photo_Completed(object sender, PhotoResult e) { if (e.TaskResult == TaskResult.OK) { BitmapImage bmpSource = new BitmapImage(); bmpSource.SetSource(e.ChosenPhoto); image1.Source = bmpSource; } else { image1.Source = null; } } } }
● SaveEmailAddressTask、SavePhoneNumberTask
儲存 Email 及電話號碼。
此範例一次介紹儲存 Email 及電話號碼,兩者使用方法相同,只是類別不同。當按下按鈕時,會將文字框中的 Email 或電話號碼送給相關的 Task 而切換到連絡人清單,可以新增或選擇原有的連絡人即可儲存。
namespace HelloWindowsPhone { public partial class MainPage : PhoneApplicationPage { //以全域方式建立變數 SaveEmailAddressTask saveEmail; SavePhoneNumberTask savePhone; // 建構函式 public MainPage() { InitializeComponent(); //產生物件及註冊完成事件 saveEmail = new SaveEmailAddressTask(); saveEmail.Completed += new EventHandler<TaskEventArgs>(saveEmail_Completed); savePhone = new SavePhoneNumberTask(); savePhone.Completed += new EventHandler<TaskEventArgs>(savePhone_Completed); } private void saveEmail_Completed(object sender, TaskEventArgs e) { } private void savePhone_Completed(object sender, TaskEventArgs e) { } private void btnSaveEmail_Click(object sender, RoutedEventArgs e) { saveEmail.Email = txtEmail.Text; saveEmail.Show(); } private void btnSavePhoneNumber_Click(object sender, RoutedEventArgs e) { savePhone.PhoneNumber = txtPhoneNumber.Text; savePhone.Show(); } } }
※Launcher
● EmailComposeTask
利用 EmailComposeTask 幫我們寄信。下圖右是寄送結果,在模擬器是無法傳送的。
程式碼:
private void button1_Click(object sender, RoutedEventArgs e) { EmailComposeTask email = new EmailComposeTask(); email.To = txtTo.Text; email.Subject = txtSubject.Text; email.Body = txtBody.Text; email.Show(); }
● PhoneCallTask
打電話啦~~左圖可以輸入電話號碼,中圖可讓使用者選擇打或不打,右圖則是撥打的畫面。
程式碼:
private void button1_Click(object sender, RoutedEventArgs e) { PhoneCallTask call = new PhoneCallTask(); call.DisplayName = "Tonycube"; call.PhoneNumber = textBox1.Text; call.Show(); }
● SerachTask
搜尋。程式碼如下:
SearchTask search = new SearchTask(); search.SearchQuery = textBox1.Text; search.Show();
● SmscomposeTask
發簡訊。程式碼如下:
SmsComposeTask sms = new SmsComposeTask(); sms.To = txtPhoneNumber.Text; sms.Body = txtMessage.Text; sms.Show();
● WebBrowserTask
使用瀏覽器開啟某網址。程式碼如下:
WebBrowserTask web = new WebBrowserTask(); web.Uri = new Uri(txtUrl.Text, UriKind.Absolute); web.Show();
● MediaPlayerLanucher
影片播放。程式碼如下:
MediaPlayerLauncher player = new MediaPlayerLauncher(); //檔案位置 player.Location = MediaLocationType.Install; //顯示全部的控制鈕 player.Controls = MediaPlaybackControls.All; //只出現停止按鈕及暫停按鈕 //mpl.Controls = MediaPlaybackControls.Pause | MediaPlaybackControls.Stop; //指定播放的檔案 player.Media = new Uri(@"Media\movie.wmv", UriKind.Relative); player.Show();
Location 屬性: 檔案的存放區域。有 3 個值:
- MediaLocationType.Install:位於安裝目錄中,即封裝於 xap 檔內。
- MediaLocationType.Data:位於隔離儲存區中。通常為從網路下載的檔案。
- MediaLocationType.None:沒作用。呼叫 show() 方法後,直接丟出 FileNotFroundException 的例外。
Media 屬性: 要播放的檔案。 Controls 屬性: 控制按鈕。 ● MarketPlaceDetailTask 啟動內建的 MarketPlace 應用程式。程式碼如下:
MarketplaceDetailTask market = new MarketplaceDetailTask(); //只能設定為Applcations market.ContentType = MarketplaceContentType.Applications; //當沒有指定值則會以目前的應用程式為目標 //如果格式檢查不符合 GUID 的格式則會丟出 exception //market.ContentIdentifier = txtID.Text; market.Show();
● MarketplaceHubTask
不透過內建應用程式,直接開啟市集。程式碼如下:
MarketplaceHubTask market = new MarketplaceHubTask(); market.ContentType = MarketplaceContentType.Applications; //mht.ContentType = MarketplaceContentType.Music; market.Show();
● MarketplaceReviewTask
讓使用者直接為您的應用程式做評分、建議等動作。在啟動後會直接開啟 Marketplace 的頁面。程式碼如下:
MarketplaceReviewTask market = new MarketplaceReviewTask(); market.Show();
● MarketPlaceSearchTask
搜尋 Marketplace 上的應用程式或音樂。