Windows Phone 學習筆記 (8) – Task

Windows Phone - Task

在 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 上的應用程式或音樂。
本文網址:https://blog.tonycube.com/2012/06/windows-phone-8-task.html
Tony Blog 撰寫,請勿全文複製,轉載時請註明出處及連結,謝謝 😀

我要留言

留言小提醒:
1.回覆時間通常在晚上,如果太忙可能要等幾天。
2.請先瀏覽一下其他人的留言,也許有人問過同樣的問題。
3.程式碼請先將它編碼後再貼上。(線上編碼:http://bit.ly/1DL6yog)
4.文字請加上標點符號及斷行,難以閱讀者恕難回覆。
5.感謝您的留言,您的問題也可能幫助到其他有相同問題的人。