Introdução

Quando desenvolvemos aplicações para dispositivos móveis (celulares, tablets), às vezes pode surgir a necessidade de acessar certas do aparelho/usuário como, por exemplo, a lista de contatos. Podemos precisar importar números, endereços, emails ou até mesmo salvar essas informações na agenda de contatos do aparelho a partir da nossa própria aplicação. Esse tipo de integração com as ferramentas do aparelho pode ser fundamental em algumas situações, pois caso não seja possível acessar tais dados pelo aplicativo, o usuário pode precisar fechar a aplicação para abrir a lista de contatos e depois voltar para a aplicação. Esse tipo de “dependência” faz com que o usuário precise “clicar” mais vezes, digitar mais dados e, consequentemente, gastar mais tempo com algo que deveria ser feito de forma mais prática.

No Windows Phone 7 os itens da lista de contatos armazenam informações como o número do telefone, email e endereço, dados que podem ser obtidos a partir da aplicação usando os recursos de integração com serviços do telefone presentes no namespace “Microsoft.Phone.Tasks”.

Esse namespace possui classes que permitem a realização de buscas na lista de contatos, no Bing Maps, além de interação com a câmera e outras funcionalidades que buscam tornar a aquisição e armazenamento de informações o mais prático possível.

Nesse artigo veremos como obter e salvar o número de telefone, o email e o endereço de contatos.

A ferramenta necessárias para a implementação dos exemplos aqui apresentados é o Visual Studio 2010 com o SDK de desenvolvimento para Windows Phone devidamente instalado, o qual contém o emulador usado para testes.

Preparando o layout da tela

Para os exemplos que desenvolveremos aqui, utilizaremos um único layout bastante simples, composto apenas por um TextBox e um Button. Na página principal, substitua o Grid ContentPanel por um StackPanel e dentro dele adicione os componentes citados. Para isso, utilize o código abaixo.

Listagem 1: Layout geral utilizado nos exemplos

<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <Button Name="btnBuscar" Content="Buscar contato" Click="btnBuscar_Click"/>
    <TextBox Name="txtContato"/>
</StackPanel>

A interface deverá ficar como na Figura 1.

Interface da aplicação

Figura 1: Interface da aplicação

Apesar de mantermos o nome “btnBuscar” e o texto “Buscar contato”, utilizaremos esse mesmo botão para os exemplos onde salvaremos informações na lista de contatos. Afinal, todos sabemos que o nome e o texto do componente não influencia diretamente no seu funcionamento.

Obtendo o número de telefone de um contato

Para obter o número de telefone de um contato, a peça chave é a classe PhoneNumberChooserTask, que permite acessar a lista e acessar o número do contato selecionado.

A listagem a seguir mostra a utilização dessa classe no evento Click do botão (que pode ser acessado dando dois cliques sobre o mesmo no design). Após o método btnBuscar_Click, temos o método phone_Completed, que trata o evento Completed do objeto PhoneNumberChooserTask. As informações do contato são obtidas nesse evento, o argumento PhoneNumberResult.

Listagem 2: Obtendo o número do telefone

private void btnBuscar_Click(object sender, RoutedEventArgs e)
{
    PhoneNumberChooserTask phone = new PhoneNumberChooserTask();
    phone.Completed += new EventHandler<PhoneNumberResult>(phone_Completed);
    phone.Show();
}

void phone_Completed(object sender, PhoneNumberResult e)
{
    if (e.Error == null && e.TaskResult == TaskResult.OK)
    {
        txtContato.Text = e.PhoneNumber;
    }
}

Após instanciar o objeto PhoneNumberChooserTask e adicionar uma função de tratamento para o evento Completed, é necessário chamar o método Show para que a ação de seleção seja de fato executada. Isso será necessário em todos os exemplos que veremos a seguir.

Na função phone_Completed verificamos primeiro se não houve erro durante a operação e se o usuário realmente selecionou algo, ou seja, se o TaskResult é igual a OK. Se tudo der certo, obtemos o número do telefone através da propriedade PhoneNumber do argumento “e”.

A figura a seguir mostra a lista de contatos aberta após termos clicado no botão.

Lista

Figura 2: Lista de contatos aberta para seleção

Para exemplo, foi selecionado o primeiro contato (Andrew Hill). O seu número foi então exibido no TextBox, como vemos na Figura 3.

Telefone do contato selecionado

Figura 3: Telefone do contato selecionado

Obtendo o email de um contato

Obter o email de um contato é bastante semelhante a operação anterior, apenas alteramos a classe, que dessa vez será a EmailAddressChooserTask. No mais, usamos a mesma estrutura (evento Completed e método Show).

Listagem 3: Obtendo o email

private void btnBuscar_Click(object sender, RoutedEventArgs e)
{
    EmailAddressChooserTask email = new EmailAddressChooserTask();
    email.Completed += new EventHandler<EmailResult>(email_Completed);
    email.Show();
}

void email_Completed(object sender, EmailResult e)
{
    if (e.Error == null && e.TaskResult == TaskResult.OK)
    {
        txtContato.Text = e.Email;
    }
}

A estrutura é realmente a mesma que a do exemplo anterior, então dispensa maiores comentários. A figura a seguir mostra o resultado após termos clicado no botão e selecionado novamente o contato Andrew Hill.

Email do contato selecionado

Figura 4: Email do contato selecionado

Obtendo o endereço de um contato

Nesse terceiro exemplo, o código novamente é muito parecido com os anteriores. A diferença é que agora utilizaremos a classe AddressChooserTask e, no resultado, teremos o argumento AddressResult do qual obteremos a propriedade Address.

Listagem 4: Obtendo o endereço

private void btnBuscar_Click(object sender, RoutedEventArgs e)
{
    AddressChooserTask address = new AddressChooserTask();
    address.Completed += new EventHandler<AddressResult>(address_Completed);
    address.Show();
}

void address_Completed(object sender, AddressResult e)
{
    if (e.Error == null && e.TaskResult == TaskResult.OK)
    {
        txtContato.Text = e.Address;
    }
}

Vale observar que quando clicamos no botão para buscar o contato, a lista está reduzida. Isso se deve ao filtro que é feito para exibir apenas os contatos que possuem endereço cadastrado.

Selecionando novamente o contato Andrew Hill, temo seu endereço exibido no TextBox.

Endereço do contato selecionado

Figura 5: Endereço do contato selecionado

Salvando o número do telefone de um contato

Agora passaremos aos exemplos de como salvar informações na lista de contatos. Este primeiro ponto salvaremos o número de telefone de um contato, que selecionaremos na lista. Aqui o código é mais simples, pois não precisaremos tratar o evento Completed como nos exemplos anteriores, basta instanciar um objeto da classe SavePhoneNumberTask, definir o número do telefone e chamar o método Show.

Novamente no evento Click do botão btnBuscar adicione o código mostrado na Listagem 5.

Listagem 5: Salvar o telefone

private void btnBuscar_Click(object sender, RoutedEventArgs e)
{
    SavePhoneNumberTask phone = new SavePhoneNumberTask();
    phone.PhoneNumber = txtContato.Text;
    phone.Show();
}

Isso é o bastante para executar a ação de salvar o número de telefone de um contato. Porém, aqui cabe uma pequena modificação no código XAML para alterar o formato de inserção de dados no TextBox. Vamos alterar a propriedade InputScope, passando para ela o valor “TelephoneNumber”, isso fará com que apenas números e alguns símbolos sejam aceitos na digitação, posto que ali será inserido um número de telefone.

Listagem 6: Código do TextBox para digitação de telefones

<TextBox Name="txtContato" InputScope="TelephoneNumber"/>

Na figura a seguir temos o momento da digitação de um número no TextBox.

Digitando o número do telefone

Figura 6: Digitando o número do telefone

Após digitar o número e clicar no botão, a lista de contatos é novamente exibida e nela devemos selecionar um item cujo número de telefone estamos salvando. Após selecionar o contato, haverá uma tela onde devemos escolher o tipo de número (celular, casa, trabalho, etc.), como vemos na figura seguir.

Selecionando o tipo de telefone

Figura 7: Selecionando o tipo de telefone

Após escolher o nome, clicamos no botão “salvar“ (primeiro da esquerda par a direita na barra de opções). São então mostradas as informações gerais do contato, como mostra a Figura 8, e podemos voltar para a aplicação normalmente.

Informações do contato alterado

Figura 8: Informações do contato alterado

Salvando o email de um contato

Para salvar o email o procedimento é praticamente o mesmo que o do exemplo anterior, apenas é preciso alterar a classe utilizada, que nesse caso é a SaveEmailAddressTask.

Listagem 7: Salvando o email

private void btnBuscar_Click(object sender, RoutedEventArgs e)
{
    SaveEmailAddressTask email = new SaveEmailAddressTask();
    email.Email = txtContato.Text;
    email.Show();
}

Agora, porém, é conveniente alterar o InputScope do TextBox para facilitar a digitação de emails, exibindo o símbolo de arroba (@) e o “.com” no teclado. Para isso, podemos repetir o código da Listagem 6, substituindo o TelephoneNumber por “EmailSmtpAddress”.

Daí pra frente o processo é o mesmo que para salvar o número de telefone, não sendo necessário ilustrar aqui.

Conclusão

Ao longo desse artigo vimos o quão simples é obter e salvar dados da e na lista de contatos. As classes do namespace Microsoft.Phone.Tasks tornam essas tarefas bastante práticas e de fácil implementação.

Como leitura complementar, fica a sugestão deste artigo, no qual é explicado como integrar a aplicação com o Bing Maps, localizando pontos e traçando rotas: Windows Phone 7: Integração com o Bing Maps.

Espero que tenham gostado. Até a próxima oportunidade.