Windows Phone 學習筆記 (8) – Task

  • 2135
  • 0

在 Windows Phone 7 中有些功能必須透過 Task 才能達成。

Photo by digitaltrends.com

(本文同步發表於 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 上的應用程式或音樂。