Quando desenvolvermos aplicações para dispositivos móveis, sejam para Android, iOS, Windows Phone, BlackBerry ou qualquer outra plataforma, é comum (e natural) querer (e precisar) utilizar os recursos do aparelho, tais como câmera, acelerômetro, entre outros.

Por mais que não se implemente tais funcionalidades inicialmente, não demora muito até o cliente solicitar alguma alteração nesse sentido. E por se tratar de um smartphone (no fundo, um celular), não é de se estranhar se nos for solicitado que o usuário possa efetuar ligações a partir da aplicação, sem precisar minimiza-la e acessar a lista de contatos ou a menu de chamadas telefônicas.

Com base nisso, este artigo explicará como realizar ligações a partir de aplicações próprias para Windows Phone. Aqui será utilizada a linguagem C# e a versão escolhida será a 7.x, de forma que o a aplicação aqui desenvolvida possa ser executada tanto no Windows Phone 7, quanto no 8.

Leia também: Rumo ao Desenvolvimento Mobile - Iniciação com Windows Phone

Iniciando a aplicação

Inicialmente devemos acessar o menu FILE > New > Project... no Visual Studio (nesse caso, o 2012 com o SDK para Windows Phone devidamente instalado). Na categoria Windows Phone, selecionamos o template Windows Phone App e na caixa de diálogo que será exibida, devemos selecionar a opção Windows Phone OS 7.1, conforme explicado anteriormente.

Na página inicial, MainPage.xaml, vamos inserir alguns controles que darão forma à nossa aplicação. O Grid de nome ContentPanel deve ficar como o código constante na Listagem 1, que insere um ListBox e um Button que serão utilizados posteriormente.

<!--ContentPanel - place additional content here-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
    <StackPanel>
        <ListBox x:Name="lbxClientes">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel>
                        <TextBlock Text="{Binding Path=Nome}" FontSize="30"/>
                        <TextBlock Text="{Binding Path=Telefone}" FontSize="20"/>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>
        <Button x:Name="btnLigar" Content="Ligar"/>
    </StackPanel>
</Grid>
Listagem 1. Código XAML inserido na página principal

Essa ListBox será utilizada para listar alguns objetos que criaremos a seguir, simulando uma lista de clientes de uma aplicação comercial qualquer. Clicando no botão Ligar, o usuário poderá efetuar uma chamada para o telefone do cliente selecionado na lista.

Criemos então uma nova classe chamada Cliente, clicando com a direita no projeto, no Solution Explorer, e em Add > Class. Essa classe possuirá apenas dois atributos: nome e telefone, conforme vemos na Listagem 2.

public class Cliente
{
    private string _nome;
    private string _telefone;

    public string Nome
    {
        get { return _nome; }
        set { _nome = value; }
    }        

    public string Telefone
    {
        get { return _telefone; }
        set { _telefone = value; }
    }
}
Listagem 2. Classe Cliente

Em seguida, no evento Loaded da MainPage, vamos instanciar alguns clientes e lista-los na ListBox. O código para realizar tal tarefa é apresentado na Listagem 3.

private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e)
{
    List<Cliente> clientes = new List<Cliente>();
    clientes.Add(new Cliente() {
        Nome = "José",
        Telefone = "32322323"
    });

    clientes.Add(new Cliente()
    {
        Nome = "Maria",
        Telefone = "87123456"
    });

    clientes.Add(new Cliente()
    {
        Nome = "Carlos",
        Telefone = "91987654"
    });

    lbxClientes.ItemsSource = clientes;
}
Listagem 3. Evento Loaded da página MainPage

Executando a aplicação no emulador já podemos ver os clientes listados, conforme ilustra a Figura 1.

Clientes listados na ListBox
Figura 1. Clientes listados na ListBox

Agora precisamos implementar o evento Click do botão Ligar, dando duplo clique sobre o mesmo no design, o que deve nos levar ao código C# da página. O código desse evento deve ficar como mostrado na Listagem 4, a seguir.

private void btnLigar_Click(object sender, RoutedEventArgs e)
{
    Cliente cliente = (Cliente)lbxClientes.SelectedItem;

    PhoneCallTask ligacao = new PhoneCallTask()
    {
        DisplayName = cliente.Nome,
        PhoneNumber = cliente.Telefone
    };

    ligacao.Show();
}
Listagem 4. Evento Click do botão Ligar

No código acima utilizamos a classe PhoneCallTask, responsável por realizar ligações a partir da nossa aplicação. Ao invocar o método Show, o usuário é questionado se deseja realmente efetuar uma ligação para o número selecionado. Essa confirmação é necessária pois ao efetuar uma ligação, o cliente será cobrado por isso, de acordo com os serviços da sua operadora de telefonia móvel.

Podemos agora executar a aplicação, selecionar um cliente na lista e pressionar o botão Ligar. A Figura 2 ilustra essa ação.

Ligando para o número selecionado
Figura 2. Ligando para o número selecionado

Aceitando a solicitação e pressionando o botão call (ligar), a ligação é iniciada normalmente, como se vê na Figura 3.

Ligação em andamento
Figura 3. Ligação em andamento

Conclusão

Esse tipo de funcionalidade é muito comum em aplicações para dispositivos móveis e, muitas vezes, pode até se apresentar como um diferencial, pois tende a facilitar a vida do usuário, que não precisará sair da aplicação para ligar para um número que está ali na sua tela.

Como vimos, a responsável pelo serviço é a classe PhoneCallTask do namespace Microsoft.Phone.Tasks. Essa classe recebe os valores para os atributos DisplayName e PhoneNumber, que representam, respectivamente, o nome e o número para o qual se deseja ligar.

Caso o número discado já esteja registrado na lista de contatos do usuário, o nome que será exibido durante a ligação (Figura 3) será o do contato salvo na agenda e não o nome informado na propriedade DisplayName do objeto PhoneCallTask.

Outro ponto importante é que o formato do número informado deve ser válido, caso contrário, a ligação não poderá ser efetuada.