Сложные приёмы разработки приложений для Windows Phone 8

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

Разбить на страницы
Показывать лекцию целиком

Цель работы: освоить методы работы с сервисами устройства

Общие сведения

Приложения для Windows Phone могут работать с сервисами телефона. Эта возможность реализована как с помощью некоторых API, таких, например, как программные интерфейсы для работы со списком контактов и календарем (http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202972(v=vs.105).aspx), так и с помощью специальных механизмов, называемых задачами выбора (Choosers) и задачами выполнения (Launchers).

При выполнении задачи выбора (например, при вызове системного интерфейса камеры) в приложение, после работы пользователя, возвращаются некие данные. При использовании задачи выполнения в нашем приложении производится подготовка задачи, задача вызывается, ей передаются подготовленные данные, а дальнейшая работа с ней наше приложение уже не затрагивает. Работу задачи выполнения контролирует пользователь. То есть, например, если мы вызвали задачу выполнения для отправки SMS-сообщения из нашего приложения, пользователь самостоятельно принимает окончательное решение о содержании сообщения и об его отправке. То же самое касается и многих других задач выполнения, сведения о которых можно найти в разделе документации "Launchers and Choosers for Windows Phone" ("Задачи выполнения и выбора для Windows Phone"), http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff769542(v=vs.105).aspx. Механизм работы со всеми задачами выполнения строится по похожей схеме.

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

Отправка электронных писем, СМС, совершение звонков из приложений

Рассмотрим задачи по отправке электронных писем, SMS, по совершению звонков из приложений, а так же – работу с адресной книгой телефона на примере приложения P18_1, рис. 51.1.

(рис 51.1) Проект приложения, демонстрирующего работу со службами телефона

Прежде чем разрабатывать подобное приложение, нужно соответствующим образом подготовить его манифест. В частности, здесь нам понадобятся такие возможности, как ID_CAP_CONTACTS и ID_CAP_PHONEDIALER

Демонстрация инициации отправки электронного письма из приложения показана на странице MailPage.xaml. На ней (Листинг 51.1) расположены три текстовых поля – для ввода адреса получателя, темы письма и текста письма.

<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBox x:Name="txtEmail" 
HorizontalAlignment="Left" Height="72" Margin="0,10,0,0" TextWrapping="Wrap" 
Text="Кому" VerticalAlignment="Top" Width="456" InputScope="EmailSmtpAddress"
 GotFocus="txtEmail_GotFocus"/>
    <TextBox x:Name="txtSubject" HorizontalAlignment="Left" 
Height="72" Margin="0,87,0,0" TextWrapping="Wrap" 
Text="Тема" VerticalAlignment="Top" Width="456" GotFocus="txtSubject_GotFocus"/>
    <Button x:Name="btnSend" Content="Отправить" 
HorizontalAlignment="Left" Margin="0,525,0,0" 
VerticalAlignment="Top" RenderTransformOrigin="-0.476,0.79" 
Width="431" Click="btnSend_Click"/>
    <TextBox x:Name="txtEmailText" HorizontalAlignment="Left" 
Height="361" Margin="0,164,0,0" 
TextWrapping="Wrap" Text="Введите текст письма" VerticalAlignment="Top" Width="456" InputScope="Text" 
VerticalScrollBarVisibility="Auto" GotFocus="txtEmailText_GotFocus"/>
</Grid>

Когда для поля происходит событие получения фокуса, вызывается обработчик, который, если в поле содержится текст, представляющий собой описание поля, очищает его. При нажатии на кнопку вызывается задача отправки письма. Этот код расположен в файле MailPage.xaml.cs, Листинг 51.2.

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

namespace P18_1
{
    public partial class MailPage : PhoneApplicationPage
    {
        public MailPage()
        {
            InitializeComponent();
        }
        //Очистка поля при первом переходе к нему
        private void txtEmail_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtEmail.Text == "Кому") txtEmail.Text = "";
        }

        private void txtSubject_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtSubject.Text == "Тема") txtSubject.Text = "";
        }

        private void txtEmailText_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtEmailText.Text == "Введите текст письма") txtEmailText.Text = "";
        }

        //Формирование письма и вызов задачи отправки письма
        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            EmailComposeTask emailComposer = new EmailComposeTask();
            emailComposer.To=txtEmail.Text;
            emailComposer.Subject=txtSubject.Text;
            emailComposer.Body=txtEmailText.Text;
            emailComposer.Show();
        }
    }
}

Обратите внимание на использование пространства имен 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>

Здесь мы разместили текстовые поля, при этом поле с именем абонента и номером используется для подготовки задачи совершения звонка, поле с номером абонента и текстом сообщения используется для подготовки задачи отправки 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 = "";
        }
    }
}

Здесь так же используется пространство имен 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>

Здесь используется список (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 = "нет результатов";
            }
        }
    }
}

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

Выводы

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

Задание

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

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

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

Страницы:

Цель работы: освоить методы работы с сервисами устройства

Общие сведения

Приложения для Windows Phone могут работать с сервисами телефона. Эта возможность реализована как с помощью некоторых API, таких, например, как программные интерфейсы для работы со списком контактов и календарем (http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202972(v=vs.105).aspx), так и с помощью специальных механизмов, называемых задачами выбора (Choosers) и задачами выполнения (Launchers).

При выполнении задачи выбора (например, при вызове системного интерфейса камеры) в приложение, после работы пользователя, возвращаются некие данные. При использовании задачи выполнения в нашем приложении производится подготовка задачи, задача вызывается, ей передаются подготовленные данные, а дальнейшая работа с ней наше приложение уже не затрагивает. Работу задачи выполнения контролирует пользователь. То есть, например, если мы вызвали задачу выполнения для отправки SMS-сообщения из нашего приложения, пользователь самостоятельно принимает окончательное решение о содержании сообщения и об его отправке. То же самое касается и многих других задач выполнения, сведения о которых можно найти в разделе документации "Launchers and Choosers for Windows Phone" ("Задачи выполнения и выбора для Windows Phone"), http://msdn.microsoft.com/en-us/library/windowsphone/develop/ff769542(v=vs.105).aspx. Механизм работы со всеми задачами выполнения строится по похожей схеме.

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

Отправка электронных писем, СМС, совершение звонков из приложений

Рассмотрим задачи по отправке электронных писем, SMS, по совершению звонков из приложений, а так же – работу с адресной книгой телефона на примере приложения P18_1, рис. 51.1.

(рис 51.1) Проект приложения, демонстрирующего работу со службами телефона

Прежде чем разрабатывать подобное приложение, нужно соответствующим образом подготовить его манифест. В частности, здесь нам понадобятся такие возможности, как ID_CAP_CONTACTS и ID_CAP_PHONEDIALER

Демонстрация инициации отправки электронного письма из приложения показана на странице MailPage.xaml. На ней (Листинг 51.1) расположены три текстовых поля – для ввода адреса получателя, темы письма и текста письма.

<!--ContentPanel – поместите здесь дополнительное содержимое-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <TextBox x:Name="txtEmail" 
HorizontalAlignment="Left" Height="72" Margin="0,10,0,0" TextWrapping="Wrap" 
Text="Кому" VerticalAlignment="Top" Width="456" InputScope="EmailSmtpAddress"
 GotFocus="txtEmail_GotFocus"/>
    <TextBox x:Name="txtSubject" HorizontalAlignment="Left" 
Height="72" Margin="0,87,0,0" TextWrapping="Wrap" 
Text="Тема" VerticalAlignment="Top" Width="456" GotFocus="txtSubject_GotFocus"/>
    <Button x:Name="btnSend" Content="Отправить" 
HorizontalAlignment="Left" Margin="0,525,0,0" 
VerticalAlignment="Top" RenderTransformOrigin="-0.476,0.79" 
Width="431" Click="btnSend_Click"/>
    <TextBox x:Name="txtEmailText" HorizontalAlignment="Left" 
Height="361" Margin="0,164,0,0" 
TextWrapping="Wrap" Text="Введите текст письма" VerticalAlignment="Top" Width="456" InputScope="Text" 
VerticalScrollBarVisibility="Auto" GotFocus="txtEmailText_GotFocus"/>
</Grid>

Когда для поля происходит событие получения фокуса, вызывается обработчик, который, если в поле содержится текст, представляющий собой описание поля, очищает его. При нажатии на кнопку вызывается задача отправки письма. Этот код расположен в файле MailPage.xaml.cs, Листинг 51.2.

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

namespace P18_1
{
    public partial class MailPage : PhoneApplicationPage
    {
        public MailPage()
        {
            InitializeComponent();
        }
        //Очистка поля при первом переходе к нему
        private void txtEmail_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtEmail.Text == "Кому") txtEmail.Text = "";
        }

        private void txtSubject_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtSubject.Text == "Тема") txtSubject.Text = "";
        }

        private void txtEmailText_GotFocus(object sender, RoutedEventArgs e)
        {
            if (txtEmailText.Text == "Введите текст письма") txtEmailText.Text = "";
        }

        //Формирование письма и вызов задачи отправки письма
        private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            EmailComposeTask emailComposer = new EmailComposeTask();
            emailComposer.To=txtEmail.Text;
            emailComposer.Subject=txtSubject.Text;
            emailComposer.Body=txtEmailText.Text;
            emailComposer.Show();
        }
    }
}

Обратите внимание на использование пространства имен 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>

Здесь мы разместили текстовые поля, при этом поле с именем абонента и номером используется для подготовки задачи совершения звонка, поле с номером абонента и текстом сообщения используется для подготовки задачи отправки 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 = "";
        }
    }
}

Здесь так же используется пространство имен 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>

Здесь используется список (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 = "нет результатов";
            }
        }
    }
}

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

Выводы

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

Задание

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

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

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

Вернуться к учебному плану