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.
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.
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.
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.
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.
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.
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.
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.
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.