В данной статье я хочу рассказать о Launchers и Chooser в Windows Phone 7 (+Mango)

Предназначены они для использования специфичных функций телефона: позвонить, отправить смс, email, выбрать контакт из списка, получить изображение с камеры и так далее.

Несколько вводных слов

Отличие Launchers от Choosers в том, что первые не возвращают никакой информации(«Запустил и забыл»). Например, отправить СМС – это простое действие, и результат его не нужен, а если нам необходимо получить изображение с камеры, то это требует, как минимум, возвращения самого изображения.

Так что же такое Launchers и Choosers? Это ничто иное как специальные системные программы(которые можно запустить извне) встроенные в систему, позволяющие выполнять различные функции. То есть когда нам необходимо мы их просто запускаем и получаем результат (или не получаем).

Небольшой пример как это выглядит:

    private void StartTask()

{
var task = new SmsComposeTask
{
To = "+375257777777",
Body = "Hello from windows phone launcher"
};
task.Show();
}

Как вы уже догадались, данный код откроет приложение для отправки смс и подставит туда номер телефона получателя и текст сообщения.

Работая с Launchers и Choosers(далее просто Launchers) необходимо учитывать, что ваше приложение будет деактивировано после того, как основной поток обработает событие, вызвавшее Show и активировано после завершения работы Launcher’а. Поэтому не забываем сохранять и восстанавливать состояние приложения!

Для большей ясности посмотрим следующий пример.

    private void StartTask()

{
var task = new SmsComposeTask
{
To = "+375257777777",
Body = "Hello from windows phone launcher"
};
task.Show(); // здесь мы запускаем программу отправки СМС
RunComplicatedCalculations(); // но на этом работа программы не останавливается.
// основной поток будет ждать завершения метода
// RunComplicatedCalculations
}

То есть будет следующая картина: после вызова Show() работа приложения не заканчивается и будет выполняться метод RunComplicatedCalculations, но в то же время будет запущена программа для отправки СМС. И только когда метод RunComplicatedCalculations будет выполнен, приложение будет деактивировано. Таким образом можно(если это нужно, конечно) запустить Launcher и в то же время выполнить какое-нибудь сложное вычисление или синхронизацию, которые будут проходить незаметно для пользователя.

Это были общие детали относительно Launchers и Choosers. Теперь подробнее…

Получения результата работы Chooser

Очень важно знать механизм получения результата у Chooser’а. Для понимания рассмотрим пример использования:

    private void StartChooser()

{
var photoChooser = new CameraCaptureTask();
photoChooser.Completed += photoChooser_Completed;
photoChooser.Show();
}
void photoChooser_Completed(object sender, PhotoResult e)
{
capturedImage.Source = new BitmapImage(new Uri(e.OriginalFileName,
UriKind.Absolute));
}

У каждого Chooser’а есть событие Completed, которое произойдет, когда мы закончим действие с Chooser’ом. В данном случае мы поместим только что сделанную фотографию в capturedImage.

Тип второго аргумента в обработчике события наследуется от TaskEventArgs, у которого есть 2 свойства:

  • public virtual Exception Error { get; internal set; }
  • public virtual TaskResult TaskResult { get; internal set; }


Error – ошибка, произошедшая во время работы Chooser’а.

TaskResult – результат работы Chooser’а. Может быть: Ok – работа прошла успешно(пользователь что-то выбрал), Cancel – пользователь ничего не выбрал (нажал «Отмена», или кнопку «Назад»), None – что-то пошло не так.

Наиболее используемые Launchers и Choosers

Далее рассмотрим по порядку наиболее часто используемые Launchers и Choosers(они все находятся в Microsoft.Phone.dll, Namespace: Microsoft.Phone.Tasks )

Как работать с email

  1. Как добавить email-адрес контакту: SaveEmailAddressTask
      var task = new SaveEmailAddressTask();
    
    task.Completed += (s, e) => // что-то сделать;
    task.Show();
  2. Как отправить email: EmailComposeTask
     var task = new EmailComposeTask      {
    
    Subject = "Тема сообщения",
    Body = "Сообщение",
    To = "xxx@gmail.com",
    Cc = "agent007@example.com",
    Bcc = "yyy@live.com",
    CodePage = 1251
    }.Show()
  3. Как выбрать email адрес из списка контактов: EmailAddressChooserTask
      var task = new EmailAddressChooserTask();
    
    task.Completed += (s, e) =>
    {
    if (e.TaskResult == TaskResult.OK)
    {
    var resultTextBlock = new TextBlock
    {
    Text =
    string.Format("Display name: {0}, Email: {1}",
    e.DisplayName, e.Email)
    };
    resultPanel.Children.Add(resultTextBlock);
    }
    };
    task.Show();


Следует учесть, что отправить email нельзя на эмуляторе, так как у вас должен быть настроен email аккаунт.

Как работать с изображениями

  1. Как выбрать  изображение из памяти телефона: PhotoChooserTask
    var task = new PhotoChooserTask
    
    {
    PixelHeight = 400,
    PixelWidth = 400,
    ShowCamera = true
    };
    task.Completed += (s, e) =>
    {
    if (e.TaskResult == TaskResult.OK)
    {
    var image = new Image
    {
    Source =
    new BitmapImage(new Uri(e.OriginalFileName,
    UriKind.Absolute))
    };
    resultPanel.Children.Add(image);
    }
    };
    task.Show();

    Здесь стоит рассмотреть свойства класса PhotoChooserTask:

    PixelHeight и PixelWidth Задают максимальный размер картинки выбранного изображения.
    ShowCamera Если равен true, то у пользователя будет возможность получить изображение сразу с камеры.

    В обработчике события Completed результат можно получить через второй параметр типа PhotoResult:

    ChosenPhoto Поток на выбранное изображение. Тип Stream.
    OriginalFileName Полный путь к выбранному изображению.
  2. Как получить изображение с камеры: CameraCaptureTask
        var task = new CameraCaptureTask();
    
    task.Completed += (s, e) =>
    {
    if (e.TaskResult == TaskResult.OK)
    {
    var image = new Image
    {
    Source =
    new BitmapImage(new Uri(e.OriginalFileName,
    UriKind.Absolute))
    };
    resultPanel.Children.Add(image);
    }
    };
    task.Show();

    Дополнительных свойств для CameraCaptureTask нет и второй параметр в обработчике события Completed имеет тип PhotoResult. Поэтому работать с ним нужно также как и с PhotoChooserTask (см. выше).

Как работать с телефонными номерами

  1. Как выбрать номер телефона из списка контактов: PhoneNumberChooserTask
        var task = new SavePhoneNumberTask {PhoneNumber = "+375257777777"};
    
    task.Completed += (s, e) => // что-то сделать;
    task.Show();

    Второй параметр обработчика события Completed имеет тип TaskEventArgs и содержит описанные в начале статьи свойства(и далее, если тип второго параметра обработчика события Completed будет TaskEventArgs , то я не буду заострять на этом внимание).

  2. Как выбрать номер телефона из списка контактов: PhoneNumberChooserTask
    var task = new PhoneNumberChooserTask();
    
    task.Completed += (s, e) =>
    {
    if (e.TaskResult == TaskResult.OK)
    {
    var resultTextBlock = new TextBlock
    {
    Text =
    string.Format("Display name: {0}, Phone number: {1}",
    e.DisplayName, e.PhoneNumber)
    };
    resultPanel.Children.Add(resultTextBlock);
    }
    };
    task.Show();

    Здесь все интуитивно понятно (свойства e.DisplayName и e.PhoneNumber)

  3. Как позвонить: PhoneCallTask
    var task = new PhoneCallTask
    
    {
    DisplayName = "Ivan Sidorov",
    PhoneNumber = phoneNumber
    }.Show();

    Тоже все прозрачно, но есть одно замечание: запуск данной программы не деактивирует ваше приложение.

  4. Как отправить SMS: SmsComposeTask
        var task = new SmsComposeTask
    
    {
    To = "+375257777777",
    Body = "Hello"
    }.Show();

    Здесь мы можем задать 2 свойства – номер телефона получателя и текс сообщения.

Как работать со встроенным браузером и поиском

  1. Как запустить встроенный поисковик (Bing): SearchTask
    var task = new SearchTask
    
    {
    SearchQuery = "idev.by"
    }.Show();

    Единственный параметр – строка поиска.

  2. Как открыть встроенный браузер на заданной странице: WebBrowserTask
    var task = new WebBrowserTask
    
    {
    Uri = new Uri("http://idev.by", UriKind.Absolute)
    }.Show();

    Uri – URL адрес страницы

Как работать со встроенным медиа-плеером

Для этого предназначен класс MediaPlayerLauncher.

Свойства MediaPlayerLauncher:

Orientation Ориентация экрана(портрет/пейзаж) в которой будет запущен медиа-плеер.
Controls Задает какие кнопки будут на плеере. Тип:

[Flags]

public enum MediaPlaybackControls

{

None = 0,

Pause = 1,

Stop = 2,

FastForward = 4,

Rewind = 8,

Skip = 16,

All = Skip | Rewind | FastForward | Stop | Pause,

}

Если необходим не полный набор кнопок(и не одна), то элементы перечисления можно комбинировать, например:

Controls = MediaPlaybackControls.Pause | MediaPlaybackControls.Stop
Location Задает тип местоположения файла:

MediaLocationType.Install –используется для файлов, которые хранятся в директории установки приложения (добавлены в проект и копируются в xap файл приложения)

MediaLocationType.Data — для файлов, которые приложение сохраняет в изолированном хранилище.

MediaLocationType.None – будет сгенерировано исключение FileNotFoundException
Media Путь к медиа-файлу

Пример:

var task = new MediaPlayerLauncher

{
Orientation = MediaPlayerOrientation.Portrait,
Controls = MediaPlaybackControls.All,
Location = MediaLocationType.Install,
Media = new Uri("Data/Bon Jovi - Its My Life.mp3",
UriKind.Relative)
}.Show();

Следует учесть, что в эмуляторе нельзя проигрывать  видео

На это мы заканчиваем данную статью, но не закрываем тему. В следующей серии вас ждет знакомство с Launchers, добавленными в великолепной Mango.

Исходники LaunchersAndChoosersSrc

Последние статьи

  • Перехват трафика с помощью Fiddler

  • Dependency Property изнутри — Часть вторая

  • Dependency Property изнутри. Часть первая.

  • Индексы в локальной базе данных

  • Реализация простой фотогалереи на Windows Phone 7

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *