Sua aplicação Mobile DelphiXE5 efetuando chamada telefônica sem necessidade de consultar a agenda ou outro aplicativo. De a seus usuários ótima experiência.

Imagine que você tem uma aplicação móvel que carrega a lista de fornecedores de seu cliente, nessa lista há informações como Nome, Telefone, e-mail, etc. Você pega a informação de telefone e gostaria de usá-la para efetuar uma ligação para esse fornecedor. Você memoriza esse telefone e no aplicativo de discagem do seu smartphone digita esse número para efetuar a chamada. Por que não fazer isso direto de seu aplicativo? O número do fornecedor já está armazenado lá… Vamos ao Delphi XE 5 então?!

 Criando a UI (User Interface – Interface do Usuário)

Abra o Delphi XE5 e crie Novo Projeto Móvel através do menu File–> New Project –> Delphi Projects –> Mobile Projects. Utilizaremos novamente o modelo de aplicação em branco (Blank Application).

Vamos salvar nosso projeto através do Menu File –> Save All (SHIFT +CTRL + S), crie uma pasta denominada prjDiscador para salvarmos nossos arquivos dentro dela. Chamaremos a Unit do formulário de frmDiscadorUnt e o projeto chamaremos Discador.

Insira no formulário um Listbox, renomeie-o para lbxFornecedores, clique com o botão direito sobre ele e selecione a opção Add Item.

Adicionando Itens ao ListBox

Vamos adiconar 1 TListBoxHeader e 3 TListboxItem. E configurar suas propriedades como abaixo:

  • ListBoxItem1
    • ItemData.Text –> ‘Banco do Brasil’
    • ItemData.Detail –> ‘0800 729 0722’
    • StyleLookup –> listboxitembottomdetail
  • ListBoxItem2
    • ItemData.Text –> ‘Caixa’
    • ItemData.Detail –> ‘0800 726 0101’
    • StyleLookup –> listboxitembottomdetail
  • ListBoxItem3
    • ItemData.Text –> ‘Loja da Esquina’
    • ItemData.Detail –> ”
    • StyleLookup –> listboxitembottomdetail

Altere a propriedade Align do lbxFornecedores para alClient, assim ele passará a ocupar toda a tela do aplicativo. Quando alteramos as propriedades StyleLookup dos ListBoxItens listboxitembottomdetail fizemos com que a informação do campo Detail passe a ser exibida abaixo do texto principal do item.

Agora que já temos os dados de nossos “fornecedores” vamos codificar nossa aplicação dando a ela a funcionalidade proposta na postagem.

Funcionamento e Codificação da aplicação

Basicamente a aplicação efetuará a discagem para o item selecionado no lbxFornecedores vamos fazer alguns ajustes no código. Pressione F12 para visualizarmos a Unit e nela vamos inserir na cláusula uses da seção Interface vamos adicionar os seguintes Namespaces:

  //Namespaces adicionados
  FMX.PhoneDialer, FMX.Platform;

 Vamos ainda acrescentar à definição de nosso Formulário (frmDiscador) uma variável Discador em sua seção private como segue:

  private
    { Private declarations }
    Discador : IFMXPhoneDialerService;

Assim já temos tudo pronto para inserir o código que efetuará a chamada telefônica propriamente dita, para isso codificaremos o evento OnItemClick do lbxFornecedores como abaixo:

procedure TfrmDiscador.ListBox1ItemClick(const Sender: TCustomListBox;
  const Item: TListBoxItem);
begin
  if not Item.ItemData.Detail.IsEmpty then
    begin
      TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(Discador));
      if Assigned(Discador) then
        begin
          Discador.Call(Item.ItemData.Detail);
        end;
    end
  else
    begin
      Discador.Call(InputBox('Fornecedor sem número.', 'Informe o número a ser discado', '' ));
    end;

end;

voilà…

Execute a aplicação e verá que já temos a chamadas telefônicas acontecendo ao clicar sobre os itens da nossa lista de fornecedores.

Faz-se notar que nosso último fornecedor não tem informado seu número de telefone, quando o campo Detail do item estiver vazio, será exibida uma InputBox solicitando o número a ser discado.

InputBox Discar

A simplicidade de implementar essa funcionalidade em sua aplicação pode fazer a diferença no cotidiano de seu usuário/cliente, pense nisso.

Até a próxima e bons códigos!

17 Replies to “Delphi XE5 Efetuando chamadas telefônicas direto de sua aplicação móvel”

    1. Olá Rafael… não compreendi muito bem. Mas enfim, se quiser me mandar parte do seu código para eu analisar fique a vontade.
      Mande-me como vc fez e o que está dando errado.

      1. Muito obrigado pela atenção!
        É o seguinte:
        Estou usando um ListView, e este Listview possui 3 details, o telefone está no detail 3. Não sei como pegar o detail 3, igual ao que você fez usando oListbox.
        Você fez assim no Listbox:

        Discador.Call(Item.ItemData.Detail);

        Como seria no Listview?

        Segue uma das formas que tentei

        procedure TFormMenu.lvwListaItemClick(const Sender: TObject;
        const AItem: TListViewItem);
        begin
        if not AItem.Item.Detail3.IsEmpty then
        ibegin
        TPlatformServices.Current.SupportsPlatformService(IFMXPhoneDialerService, IInterface(Discador));
        if Assigned(Discador) then
        begin
        Discador.Call(AItem.Item.Detail3);
        end;
        end
        else
        begin
        Discador.Call(InputBox('Fornecedor sem número.', 'Informe o número a ser discado', '' ));
        end;
        end;

        Mais uma vez, obrigado!

  1. Landerson Gomes, bom dia.

    Muito obrigado pelo blog, e uma ferramenta de utilidade para quem esta aprendendo sobre androide x delphi.
    Me da um help, estou usando o XE7 a aplicação copila sem problema na hora de executar no aparelho, fala que o projeto parou de responder e não abre.
    Percebi que tem algumas diferenças de códigos para XE5, XE6 para o XE7 eu sei que me arrependi, porque todo o material é para XE anteriores ao 7 nem sempre consigo fazer o mesmo projeto.
    Me da um help.

    obrigado.

    1. Thiago na verdade todos os projeto o único diferencial que foi preciso fazer foi a inclusão na cláusula uses do namespace (UNIT): Androidapi.Helpers;

      Com isso consegui rodar todos os exemplos na versão XE7, apenas lembrando que não cheguei a utilizar a XE6.

      Espero que consiga aí!

      Abraço!

  2. Bom dia Landerson…seus aplicativos são ótimos, com eles a gente consegue fazer as idéias fluirem. Gostaria que vc me desse uma luz, estou desenvolvendo um aplicativo em delphi xe7 para android…coloquei no form os componente TButton com a propriedade Text denominada AGENDA TELEFÕNICA, um TEdit para entrar com o numero do telefone do contato, sendo que no evento OnClick do componente TButton digitei a seguinte linha de código (um trecho do seu exemplo):
    procedure TFormprincipal.SpeedButtoncontatoClick(Sender: TObject);
    var uri : string; Intent : JIntent; idContato : Integer;
    begin
    uri:= ‘content://com.android.contacts/contacts/’;
    Intent:= TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_PICK,TJnet_Uri.JavaClass.parse(StringToJString(TIdURI.URLEncode(uri))));
    SharedActivity.startActivityForResult(Intent, 0);
    end;
    ————————————————————————
    ou seja, quando o botão AGENDA TELEFÔNICA for clickado
    o aplicativo exibe a agenda do telefone com os nomes dos contatos…..Agora vêm o meu apelo para você: quando eu selecionar o nome do contato na agenda, quero que seja colocado na propriedade Text do componente TEdit o número do telefone deste contato que foi selecionado. Desde já agradeço sua ajuda.

    1. Respondi sua postagem anterior como sendo uma postagem em separado, entretanto agora vendo esta acredito que ambas refiram-se ao problema levantado.
      Sinceramente nunca tentei fazer, o ideal seria pegar o código Android nativo e tentar converter para Delphi.
      Ainda não necessitei dessa solução, mas assim que possível tentarei obtê-la, caso consiga antes me mande um feedback e se possível compartilhe!

      Cordialmente…

    1. Olá Ney… seja bem vindo ao blog!
      Bem todo o código da postagem é Delphi, assim sendo ele já está disponibilizado… basta o grandioso copiar e colar, embora eu acredite que seja mais didático a leitura, e digitação dos mesmos!

      Obrigado por sua participação!

    1. Fávio bem vindo e obrigado por sua participação!
      O processo solicitado requer grandes conhecimentos na plataforma Android, ou seja, você vai fazer uma interação via intent com Contacts.Contracts.Contact do Android.
      Particularmente acredito ser meio que re-inventar a roda, mas enfim caso siga essa linha suas pesquisas devem concentrar-se mais no Android e menos no Delphi, após conseguir achar a solução via Android você adaptará esta para o mundo Delphi.

      Como é algo que nunca fiz, não consigo ser mais efetivo que apontar uma tentativa.
      De qualquer forma, espero tê-lo ajudado mesmo que pouco.

      Mais uma vez obrigado por sua participação!

  3. A pergunta é um pouco diferente, mas não encontrei aqui outra forma de perguntar.
    ———————————————————-
    Alguém tem ideia por onde começo ?

    Preciso criar um discador de modens 3g/4g para meu modem claro. Porque esse meu é muito ruim. Quero ter um próprio.

Deixe um comentário