Получение списка контактов из приложения Windows Phone 8

Windows Phone 8 имеет встроенное приложение для хранения контактов. Контакты используются при совершении исходящих и получении входящих звонков, создании SMS или e-mail сообщения и в любом другом месте, где требуется контактная информация людей из записной книжки. Очевидно, что приложению тоже может потребоваться эта информация, поэтому давайте рассмотрим код, в котором мы получим доступ к списку контактов.

Первое, что необходимо сделать — разрешить приложению получать доступ к списку контактов. Для этого необходимо установить разрешение ID_CAP_CONTACTS в манифесте приложения:

Для получения доступа к списку контактов используется объект Contacts из пространства имен Microsoft.Phone.UserData. Для получения списка контактов следует создать новый объект Contacts и выполнить поисковый запрос путем вызова метода SearchAsync. Для получения всех контактов нужно передать пустую строку. Второй параметр этого метода указывает какие именно данные нужно учитывать при выполнении поиска (например, можно искать по номеру телефона или e-mail). Третий параметр – объект состояния, который будет доступен при получении результата. При завершении операции поиска контактов будет сгенерировано событие SearchCompleted, в параметрах которого можно найти результат. Выведем все контакты из списка контактов в ListBox на форме при открытии страницы:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
  Contacts contacts = new Contacts();

  contacts.SearchCompleted += OnContactsSearchCompleted;
  contacts.SearchAsync(String.Empty, FilterKind.None, null);

  base.OnNavigatedTo(e);
}

private void OnContactsSearchCompleted(object sender, ContactsSearchEventArgs e)
{
  ContactsList.ItemsSource = e.Results;
}

Коллекция Results содержит список всех найденых контактов. Каждый объект этой коллекции содержит исчерпывающую информацию о контакте.

Нередко требуется получить также и фото контакта. Для этого у каждого объекта Contact из коллекции Results существует метод GetPicture, который возвращает поток с изображением. Изменим немного обработчик события получения контактов:

private void OnContactsSearchCompleted(object sender, ContactsSearchEventArgs e)
{
  ContactsList.ItemsSource = e.Results.Select(x =>
  {
    BitmapImage photo = null;
    try
    {
      Stream imageSource = x.GetPicture();

      if (imageSource != null)
      {
        photo = new BitmapImage();
        photo.SetSource(imageSource);
      }
    }
    catch (Exception ex)
    {
      Debug.WriteLine(ex);
    }

    return new
    {
      Name = x.DisplayName,
      Image = photo
    };
});
}

Здесь мы для каждого контакта проверяем наличие изображения и, если оно существует, получаем его. Для отображения в пользовательском интерфейсе подготовим объект BitmapImage. Теперь для отображения создадим DataTemplate для элемента ListBox, который отображает наши контакты:

<ListBox x:Name="ContactsList">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid>
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="100" />
          <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
                    
        <Image Grid.Column="0"
               Margin="10"
               Width="100" Height="100"
               Source="{Binding Image}"/>

        <TextBlock Grid.Column="1"
                   Margin="10"
                   Text="{Binding Name}"
                   VerticalAlignment="Center"
                   Style="{StaticResource PhoneTextNormalStyle}"/>
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

Теперь приложение отображает список контактов с фотографиями.