Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 465 / 15 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 18:

Сервисы устройства: SMS, телефонная книга, электронная почта

Обратите внимание на использование пространства имен Microsoft.Phone.Tasks – именно в нём определены механизмы для работы с задачами. При работе над реальным приложением, отправляющем письмо, следует позаботиться о проверке вводимых данных, в частности – данных электронного адреса.

Перед вызовом задачи типа EmailComposeTask мы создаём соответствующий объект, заполняем его поля, после чего пользуемся методом Show(). Всё остальное – выбор учетной записи, с которой будет отправлено письмо, проверка письма, его фактическая отправка или отказ от отправки, выполняет пользователь.

Отправку электронных писем из приложений с использованием служб телефона, отправку SMS, совершение звонков, можно рассматривать как удобный способ расширения функциональности приложения, которая упрощает пользователю работу с ними.

На странице PhoneSMSPage.xaml, Листинг 51.3, показана работа с задачами для совершения звонков и отправки SMS.

<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBox x:Name="txtNumber" HorizontalAlignment="Left" Height="72" 
TextWrapping="Wrap" Text="Номер телефона" VerticalAlignment="Top" 
Width="456" InputScope="TelephoneNumber" GotFocus="TextBox_GotFocus"/>
    <Button x:Name="btnCall" Content="Позвонить" HorizontalAlignment="Left" 
Margin="280,525,0,0" VerticalAlignment="Top" Click="btnCall_Click"/>
    <TextBox x:Name="txtContactName" HorizontalAlignment="Left" Height="72" 
Margin="0,77,0,0" TextWrapping="Wrap" Text="Имя абонента" 
VerticalAlignment="Top" Width="456" GotFocus="txtContactName_GotFocus"/>
    <Button x:Name="btnSMS" Content="Написать СМС" HorizontalAlignment="Left" 
Margin="0,525,0,0" VerticalAlignment="Top" Click="btnSMS_Click"/>
    <TextBox x:Name="txtSMS" HorizontalAlignment="Left" Height="371" 
Margin="0,149,0,0" TextWrapping="Wrap" Text="Введите текст сообщения" 
VerticalAlignment="Top" Width="456" GotFocus="txtSMS_GotFocus" InputScope="Text"/>
</Grid>
Листинг 51.3. Фрагмент кода страницы PhoneSMSPage.xaml

Здесь мы разместили текстовые поля, при этом поле с именем абонента и номером используется для подготовки задачи совершения звонка, поле с номером абонента и текстом сообщения используется для подготовки задачи отправки SMS-сообщения. Эти действия реализованы в файле PhoneSMSPage.xaml.cs, Листинг 51.4.

using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;

namespace P18_1
{
    public partial class PhoneSMSPage : PhoneApplicationPage
    {
        public PhoneSMSPage()
        {
            InitializeComponent();
        }
        //Очистка поля при первом переходе к нему
        private void TextBox_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtNumber.Text == "Номер телефона") txtNumber.Text = "";
        }
        //Пользователю предлагается совершить телефонный звонок по указанному номеру
        private void btnCall_Click(object sender, RoutedEventArgs e)
        {
            PhoneCallTask callTask = new PhoneCallTask();
            callTask.PhoneNumber = txtNumber.Text;
            callTask.DisplayName = txtContactName.Text;
            callTask.Show();
        }
        //Очистка поля при первом переходе к нему
        private void txtContactName_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtContactName.Text == "Имя абонента") txtContactName.Text = "";
        }
        //Открывается интерфейс отправки SMS, содержащий введенный текст и номер для отправки
        private void btnSMS_Click(object sender, RoutedEventArgs e)
        {
            SmsComposeTask smsComposeTask = new SmsComposeTask();
            smsComposeTask.To = txtNumber.Text;
            smsComposeTask.Body = txtSMS.Text;
            smsComposeTask.Show();

        }
        //Очистка поля при первом переходе к нему
        private void txtSMS_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtSMS.Text == "Введите текст сообщения") txtSMS.Text = "";
        }
    }
}
Листинг 51.4. Код страницы PhoneSMSPage.xaml.cs

Здесь так же используется пространство имен Microsoft.Phone.Tasks, в обработчиках событий нажатия на кнопку задачи подготавливаются, после чего пользователь принимает решение о том, как будет завершено их выполнение – то есть – будет ли совершен звонок по указанному номеру, будет ли отправлено SMS, он может настроить параметры SMS, пользуясь системным интерфейсом.

На странице ContactsPage.xaml, Листинг 51.5, показана работа с адресной книгой телефона. Пример основан на материале "How to access contact data for Windows Phone" ("Как получить доступ к данным адресной книги для Windows Phone"), http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh286416%28v=vs.105%29.aspx.

Обратите внимание на то, что для успешной работы этого кода нужно объявление соответствующей возможности в манифесте приложения.

<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBlock Name="ContactResultsLabel" 
Text="результаты еще не загружены" Style="{StaticResource PhoneTextLargeStyle}" TextWrapping="Wrap" />
    <ListBox Name="ContactResultsData" ItemsSource="{Binding}" Margin="12,67,12,87" >
        <ListBox.ItemTemplate>
            <DataTemplate>
                <TextBlock Name="ContactResults" 
Text="{Binding Path=DisplayName, Mode=OneWay}" />
            </DataTemplate>
        </ListBox.ItemTemplate>wq
    </ListBox>

	<Button x:Name="btnContacts" Content="Получить список контактов" 
HorizontalAlignment="Left" Margin="68,525,0,0" VerticalAlignment="Top" 
Click="btnContacts_Click"/>
</Grid>
Листинг 51.5. Фрагмент кода страницы ContactsPage.xaml

Здесь используется список (ListBox), для которого задан шаблон данных, предназначенный для вывода списка отображаемых имен контактов, полученных из адресной книги с использованием механизма привязки данных. Программные механизмы реализованы в коде страницы ContactsPage.xaml.cs, Листинг 51.6.

using System;
using System.Linq;
using System.Windows;
using Microsoft.Phone.Controls;
using Microsoft.Phone.UserData;

namespace P18_1
{
    public partial class ContactsPage : PhoneApplicationPage
    {
        public ContactsPage()
        {
            InitializeComponent();
        }

        private void btnContacts_Click(object sender, RoutedEventArgs e)
        {
            Contacts cons = new Contacts();

            //Зададим метод, который будет вызван после выполнения асинхронной задачи поиска.
            cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted);

            //Начнем асинхронную операцию поиска
            cons.SearchAsync(String.Empty, FilterKind.None, "Contacts Test #1");

        }

        void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e)
        {
            try
            {
                //Привяжем результаты поиска к списку.
                ContactResultsData.DataContext = e.Results;

                //Переменная для хранения списка, полученного после обхода результатов
                System.Text.StringBuilder sb = new System.Text.StringBuilder();
                //Обход результата и формирование строки для вывода
                foreach (Contact con in e.Results)
                {
                    sb.AppendLine(con.DisplayName);
                }

                MessageBox.Show(sb.ToString());

            }
            catch (System.Exception)
            {
                //Результатов нет
            }

            if (ContactResultsData.Items.Any())
            {
                ContactResultsLabel.Text = "результаты";
            }
            else
            {
                ContactResultsLabel.Text = "нет результатов";
            }
        }
    }
}
Листинг 51.6. Код страницы ContactsPage.xaml

Здесь используется пространство имен Microsoft.Phone.UserData и класс Contacts из него. Мы используем асинхронную операцию выполнения выборки из адресной книги (в данном случае отбираем все элементы, без фильтрации. Когда элементы получены, мы задаём контекст данных списка, они отображаются в списке на странице. Кроме того, мы перебираем отдельные элементы адресной книги, выбираем их отображаемые имена и формируем строку, которую выводим в окне сообщения.

Выводы

Приложения для Windows Phone могут получать доступ к сервисам устройств, таким, как отправка SMS, совершение звонков, отправка электронных писем. Нужно учитывать, что подобные операции находятся под контролем пользователя – приложение лишь может подготовить электронное письмо или SMS-сообщение, лишь вызывать интерфейс для совершения звонка, подготовив номер телефона. Пользователь самостоятельно принимает окончательное решение о выполнении того или иного действия. Это ограничивает возможности приложений, но повышает защищенность системы.

Задание

Подумайте, как в приложении, разработкой которого вы занимаетесь, можно применить сервисы устройства. Например, при каких сценариях его использования уместно предоставить пользователю возможность инициировать из интерфейса приложения совершение звонка или отправку SMS. Отразите анализ в отчете.

Дополнительные материалы

К данной лекции подготовлено видеоприложение и демонстрационный программный проект.