Curso Windows Phone – Como obter informações da sua lista de contatos armazenada no WP

Olá pessoal, tudo bom?

Segue um exemplo sobre como obter informações da sua lista de contatos armazenada no Windows Phone.

A primeira coisa a fazer é implementar uma classe para representar quais informações sobre os contatos você deseja obter, exibir e/ou manipular. No caso, criei uma classe chamada Contato.cs com a seguinte estrutura:


using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.UserData;

namespace Exemplo
{
  public class Contato
  {
    public object Foto { get; set; }
    public string Nome { get; set; }
    public string Telefone { get; set; }
    public string TelefoneCorrigido { get; set; }
  }
}

Em seguida, prepare a interface da APP, que para o exemplo, imaginei um listbox exibindo a foto, o nome da pessoa e o número do telefone celular dos contatos registrados atualmente no Windows Phone. Veja o exemplo:

...
<!--LayoutRoot is the root grid where all page content is placed-->
 <Grid x:Name="LayoutRoot">
   <Grid.Background>
     <ImageBrush ImageSource="Imagens/background-page.jpg" Stretch="UniformToFill" />
   </Grid.Background>
   <Grid.RowDefinitions>
     <RowDefinition Height="Auto"/>
     <RowDefinition Height="*"/>
   </Grid.RowDefinitions>

<!--TitlePanel contains the name of the application and page title-->
 <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
   <TextBlock x:Name="ApplicationTitle" Text="EXEMPLO" Style="{StaticResource PhoneTextNormalStyle}" Foreground="Yellow" FontWeight="Bold" />
   <TextBlock x:Name="PageTitle" Text="contatos" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" Foreground="Cyan" />
 </StackPanel>

<!--ContentPanel - place additional content here-->
 <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
   <TextBlock Name="txbAguarde" Text="Carregando a lista de contatos..."
              Foreground="White"
              HorizontalAlignment="Center" />
   <toolkit:PerformanceProgressBar Name="ppbAguarde"
              VerticalAlignment="Top"
              Margin="0,35,0,0"
              IsIndeterminate="true" />
   <ListBox Name="lstContatos">
     <ListBox.ItemTemplate>
       <DataTemplate>
         <StackPanel Orientation="Vertical">
           <StackPanel Orientation="Horizontal">
             <Image Width="45" VerticalAlignment="Center"
                Name="imgFoto"
                Source="{Binding Foto}" />
             <TextBlock Name="txtNome" Height="Auto"
                FontSize="28" Foreground="White"
                VerticalAlignment="Center"
                Margin="4,0,0,0"
                Text="{Binding Nome}" />
           </StackPanel>
           <TextBlock Name="txtTelefone" Height="Auto"
              Margin="48,0,0,0" HorizontalAlignment="Left"
              FontSize="22" Foreground="DarkOrange"
              FontWeight="Bold"
              Width="Auto" Text="{Binding Telefone}"/>
         </StackPanel>
       </DataTemplate>
     </ListBox.ItemTemplate>
   </ListBox>
 </Grid>
</Grid>
...

E para concluir, vamos verificar qual a implementação necessária na classe em C# para que os dados possam ser bindados no listbox demonstrado acima.

...
using Microsoft.Phone.Controls;
using Microsoft.Phone.Tasks;
using Microsoft.Phone.UserData;
using System.Text.RegularExpressions;
using System.Windows.Media.Imaging;
using System.IO;
using System.Windows.Resources;

namespace Exemplo
{
  public partial class MainPage : PhoneApplicationPage
  {
    // Constructor
    public MainPage()
    {
      InitializeComponent();
      ListarContatos();
    }

    public void ListarContatos()
    {
      Contacts c = new Contacts();
      c.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(c_SearchCompleted);
      c.SearchAsync(string.Empty, FilterKind.None, null);
    }

    void c_SearchCompleted(object sender, ContactsSearchEventArgs e)
    {
      //Trazendo apenas os contatos com números de telefone celular que contenham 8 números ou mais.
      var dados = from c in e.Results
          where c.PhoneNumbers.Count() > 0 &&
          c.PhoneNumbers.Where(x => x.Kind == PhoneNumberKind.Mobile).FirstOrDefault() != null &&
          c.PhoneNumbers.Where(x => x.Kind == PhoneNumberKind.Mobile).FirstOrDefault().PhoneNumber.Length >= 8
          select new Contato
                    {
                      Foto = ObterFoto(c.GetPicture()),
                      Nome = c.DisplayName,
                      Telefone = c.PhoneNumbers.Where(x=>x.Kind == PhoneNumberKind.Mobile).FirstOrDefault().PhoneNumber,
                    };
      lstContatos.ItemsSource = dados;

      txbAguarde.Visibility = System.Windows.Visibility.Collapsed;
      ppbAguarde.IsIndeterminate = false;
   }

   public object ObterFoto(Stream img)
   {
     if (img != null)
        return Microsoft.Phone.PictureDecoder.DecodeJpeg(img);
     else
     {
        //Obtendo uma imagem padrão quando o contato não tem foto.
        Uri uri = new Uri("Imagens/rosto.jpg", UriKind.Relative);
        StreamResourceInfo sri = Application.GetResourceStream(uri);
        return Microsoft.Phone.PictureDecoder.DecodeJpeg(sri.Stream);
     }
   }
  }
}
...
Exemplo em funcionamento no WP
Exemplo em funcionamento no WP

 

Espero que tenham gostado.

Grande abraço,
Eduardo Henrique Rizo

[twitter-follow screen_name=’eduardorizo’ show_count=’yes’]

Post relacionado:

Curso Windows Phone Gratuíto – Vários tópicos

4 comentários em “Curso Windows Phone – Como obter informações da sua lista de contatos armazenada no WP”

  1. Pingback: Free: Curso Windows Phone – Vários tópicos | Blog do Eduardo H. Rizo

  2. Pingback: Curso Windows Phone: Exemplo de binding usando Listbox | Blog do Eduardo H. Rizo

  3. Olá Eduardo,

    O que significa no código “&gt” e “&&amp”? Qual a função deles? Estou naquele grupo de desenvolvedor do Facebook com você, mas achei que aqui você veria mais rápido.

    1. Olá, tudo bom?

      Na verdade significa apenas uma bagunça quando publiquei o post. 🙂
      Agora o código está corrigido.

      Obrigado,
      Eduardo H. Rizo

Deixe um comentário