Não resta dúvidas que o aplicativo de mensagens instantâneas Whatsapp abocanhou grande para da comunicação por dispositivos móveis, nesta postagem veremos como acioná-lo direto de uma aplicação Delphi XE7.
Como referencia vamos utilizar o FAQ do Whatsapp, lá há a explicação de como fazer através do Android em Java, o trabalho nosso aqui fica apenas na “conversão” para Delphi. Vamos ao projeto, vamos ao Delphi XE7.
Delphi como sempre fizemos
No Delphi XE7 inicie um novo projeto Multi-Device Project (Como já fizemos este procedimento por diversas vezes aqui no blog, vou considerar que podemos pular essa parte). Vamos selecionar a Target Platform Android através do Project Manager, aproveite e selecione também o Dispositivo Alvo (opção Target) para onde será feito o deploy após a compilação. Veja na imagem abaixo:
Construindo a tela do aplicativo
Vamos construir uma interface bem simples, nela teremos apenas os componentes e propriedades como listados abaixo:
- Edit1
- Align –> Top
- Text –> ”
- ReturnKeyType –> Done
- Image1
- MultiResBitmap –> [Uma imagem de sua preferência]
- WrapMode –> Stretch
- Button1
- Text –> ‘Enviar Whatsapp’
Como mencionei algo bem simples, apenas para fins didáticos.
Entendendo e codificando
Basicamente teremos no Edit1 um texto que será entregue ao Whatsapp para que ao selecionarmos o contato nele a mensagem seja enviada. Agora que já temos o conceito vamos codificar.
Vale lembrar que devemos mais uma vez fazer uso dos Namespaces ou Units para utilização dos recursos do Android no Delphi, para tal na seção implementation insira os:
implementation
{$R *.fmx}
uses
FMX.Helpers.Android, Androidapi.Jni.GraphicsContentViewText,
Androidapi.Jni.Net, Androidapi.Jni.JavaTypes, idUri, Androidapi.Jni,
Androidapi.JNIBridge, Androidapi.Helpers;
Feito isso, no OnClick do Button1 vamos inserir o código abaixo:
procedure TForm1.Button1Click(Sender: TObject);
var
IntentWhats : JIntent;
mensagem : string;
begin
if Edit1.Text.IsEmpty then
mensagem := 'Teste de envio do Whatsapp com Delphi XE7. '+ #13 +
'Confira mais no blog www.landersongomes.com.br/'
else
mensagem := Edit1.Text;
IntentWhats := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
IntentWhats.setType(StringToJString('text/plain'));
IntentWhats.putExtra(TJIntent.JavaClass.EXTRA_TEXT,
StringToJString(mensagem));
IntentWhats.setPackage(StringToJString('com.whatsapp'));
SharedActivity.startActivity(IntentWhats);
end;
Confira o resultado
Bem basta compilar e testar, confira nas imagens abaixo que funcionou perfeitamente. Parte que ainda não obtive sucesso foi selecionar o contato previamente, porém continuarei tentando e conseguindo subo uma atualização.
Como pode ver o mecanismo utilizado para efetuar a comunicação do nosso aplicativo com o Whatsapp é o que já citamos aqui no blog inúmeras vezes: Intents, vale a pena ficar por dentro desse tema, que inclusive foi o tema de minha palestra na Embarcadero Conference 2014.
Até a próxima!








Olá, Quando meu app é executado em um dispositivo com tamanho de tela diferente os componentes ficam fora do lugar original, quero saber como fazer para os componentes ficar ajustado independente do tamanho da tela.
Boa tarde! O meu projeto esta pedindo FMX.Helpers.Android.dcu
Qual a versão do Delphi vocês está utilizando Jailson?
Boa tarde Landerson! Existe a possibilidade de mandar as mensagens em lote? Ex: mandar uma mensagem para todos os meus contatos.
Olá Jailson! Bem vindo ao Blog! Existir até que existe essa possibilidade sim, entretanto como não temos aí via programação a possibilidade de informar o destinatário da mensagem fica inviável, pelo menos por enquanto, afinal ainda não consegui encontrar a solução para este caso!
Mais uma vez obrigado pela participação!
Landerson, tem como ler as mensagens recebidas do WhatsApp e direciona-la a um aplicativo Delphi ?? Tipo uma central de Mensagens ???
Funcionou muito, legal.
Obrigado …..
Prezado Landerson , tem como acessar a agenda do celular neste mesmo contexto , ??
Olá Brito, seja muito bem vindo!
Não sei se entendi corretamente, mas o que você pergunta é se tem como comunicarmos nossa aplicação direto com a agenda do dispositivo Android? Se sim a minha apresentação na Embarcadero Conference 2014 abordou isso em um dos exemplos, note que na postagem há um link para download do código fonte do exemplo.
Espero que seja útil, obrigado por sua participação e até a próxima!
Show de bola!
tem como enviar apra um determinado contato???
Olá Dalvan… acredito que tenha, só não conseguimos achar… nem em java nem em Delphi!
Mas continuo pesquisando.
Cheguei a passar o material de pesquisa utilizado na postagem para outros membros da comunidade Delphi, para que tivéssemos uma força maior de busca, mas ainda não encontramos.
Quem sabe o Whatsapp um dia libera a fonte?!
Seja bem vindo ao blog e obrigado por sua participação!
Pelo que vi tem que enviar um parametro chamado abid. Só que esse parâmetro é o id do contato na agenda do celular, pelo que entendi.
Olá Luciano… a integração com os contatos esbarra exatamente nisso, o ID vem do Android, não exclusivamente do Whatsapp.
Mas seria exatamente por essa linha, você faria a seleção com base no ID do contato para o qual a mensagem será transmitida.
Seja bem vindo e obrigado por sua participação!
já é possivel , basta fazer uma simples modificação nesse fonte!
que tipo de modificação?
Muito boa a Matéria. E ja existe a possibilidade de fazer o mesmo com o iOS? Ou seja, enviar o link para o Whatsapp do iPhone?
Olá Marcones, seja muito bem vindo!
Sinceramente não sei dizer a respeito de i-Phone, dediquei-me sempre ao ambiente Android… mas acredito que exista alguma solução sim!
Lamento não poder ajudá-lo de maneira precisa ou mais esclarecedora, porém é um tema que realmente conta apenas com minha “ignorância”.
Espero que consiga, e em conseguindo passe por aqui para deixar um feedback!
Obrigado por sua participação e até um próxima!
Olá,
Obrigado por compartilhar o conhecimento, era exatamente o que eu procurava. Mas agora surgiu a necessidade de adicionar um numero nos contatos do android, isso é possivel usando delphi? como fazer?
abraço.
Olá Fabrício, seja bem vindo!
Primeiramente obrigado por sua participação e pelas palavras!
Como cito na postagem, ainda não consegui achar uma forma de burlar o Whatsapp para conseguir diretamente isso. Pelo pouco que li da documentação ele não disponibiliza e nem permite esse “tipo de coisa”… pensando friamente talvez seja possível conseguindo o retorno da busca na agenda, entretanto vale lembrar que nem todos os seus contatos da agenda terão o Whatsapp.
Enfim meu caro, esse ainda é nosso “dilema” nessa integração!
Caso consiga evoluir aí não deixe de compartilhar e postar um feedback conosco.
Um abraço e até a próxima!
Olá,
Obrigado pelo retorno, mas quero realmente é inserir na agenda, pra driblar isso aí. Teria algum exemplo em XE7?
abraço.
Boa tarde Landerson.
Estou tentando reproduzir exatamente como está descrito, mas estou recebendo a mensagem: not Found FMX.Helpers.Android.dcu
A versão do meu delphi é XE8 Enterprise
O meu também está dando o mesmo erro.
‘FMX.Helpers.Android’ not found.
Olá, boa tarde!
Primeiramente quero parabenizar e agradecer pelo artigo com conteúdo excelente e explicado de forma objetiva e clara!
Se possível gostaria de tirar uma dúvida … Estou tendo erro no momento da compilação . O projeto é compilado tudo corretamente, no caso não estou executando em um emulador e sim em um aparelho próprio , e a aplicação não aparece na tela do dispositivo. Aparece a primeira tela da compilação do projeto, mas o aplicativo em si não aparece . Teria alguma ideia do que pode ser ?!
Desde já agradeço. Grande abraço e sucesso!
Bem vindo Roger!
Obrigado por sua participação!
Seria interessante você enviar versão do Delphi e versão do Android do dispositivo para que possa analisar, talvez seja algum update já conhecido que esteja faltando.
Fico no aguardo de seu feedback.
Mais uma vez obrigado!
Eu quem agradeço Landerson!
Consegui resolver o problema refazendo a aplicação , agora está funcionando 100% . Obrigado pelo retorno!
Estou com dúvida aqui se seria possível fazer o mesmo com o messenger do facebook , ou até mesmo apenas para direcionar para um site específico …
Se sim, poderia me ajudar com algum exemplo ?!
Agradeço desde já !
Adorei a dica, mas surgiu uma dúvida:
Como ficaria para enviar uma imagem ?
Obrigado!!!
Olá Jaques… primeiramente seja bem vindo!
Com relação a sua dúvida, infelizmente pelo fato de não ser disponibilizada uma API pelo Whatsapp acaba sendo a base de tentativa, infelizmente ainda não consegui.
Mais uma vez obrigado por sua participação, e conseguindo sucesso aí neste processo peço que dê uma feedback e se possível compartilhe aqui a solução.
Até a próxima!
Landerson, tem como fazer isso em VCL?
Hola , se puede enviar el mensaje directamente a una persona, ej
sendwhats(‘mi mensaje’, ‘nrotelefono’)
sendwhats(‘mi mensaje’, ‘44446666’)
Gracias
Olá Luis obrigado pela contribuição… vou testar e dando certo posso postar aqui com seus respectivos créditos?
Ou você já tem essa solução postada em algum lugar para que eu utilize o link para seu post?
Mais uma vez obrigado por sua participação, seja bem vindo e volte sempre que puder!
Obs.: Peço desculpas pela demora na resposta!
Olá Luis, como utilizar esse comando “sendwhats” ? testei de várias formas mas não consegui.
bom tutorial.. mais é posssivel enviar message direta a um numero no delphi a um whatapp numero tipo enviar a um numero especifico do whataap direto…..
Fala Landerson, blz?
Onde está a opção de criar pelo VCL? não encontrei!!!
Olá amigos Landerson e Kelver.
vou colocar aqui um código que montei, a partir do seu, para enviar arquivos pelo WhatsApp, no meu caso fotos (imagens em jpg).
Se testarem e/ou acharem melhor deletarem este post, fiquem a vontade. Eu já testei em vários dispositivos e funcionou legal.
Cada desenvolvedor deve fazer suas adaptações, eu mesmo estou usando de outra maneira para passar os arquivos a serem enviados, como um array of string com a lista de arquivos que selecionei anteriormente ao uso da procedure.
Vamos lá…
procedure TFandroid.WhatsAppImage;
var
IntentWhats :JIntent;
FileUri :Jnet_Uri;
iArq :integer;
mensagem, sArqOrig1, sArqOrig2, sArqEnv1, sArqEnv2 :string;
ListArqs :JArrayList;
begin
if Edit1.Text.IsEmpty then
mensagem := ‘Teste de envio do Whatsapp com Delphi XE7. ‘+ #13+#10+
‘Confira mais no blog http://www.vivaitaocara.com.br/landersongomes/‘
else
mensagem := Edit1.Text;
sArqOrig1:=’sua_pasta/arquivo1.jpg’;
sArqOrig2:=’sua_pasta/arquivo2.jpg’;
//os arquivos devem ser copiados para uma pasta que o Whatapp possa ter acesso,
//como a pasta temporária do seu app (TPath.GetTempPath)
sArqEnv1:=TPath.GetTempPath +’/’+ ExtractFileName(sArqOrig1);
sArqEnv2:=TPath.GetTempPath +’/’+ ExtractFileName(sArqOrig2);
//então copiamos os arquivos para a pasta TPath.GetTempPath
//depois é aconselhável deletá-los
Tfile.Copy(sArqOrig1,sArqEnv1);
Tfile.Copy(sArqOrig2,sArqEnv2);
//criar o array para colocarmoa a lista de arquivos a serem enviados
ListArqs:= TJArrayList.Create;
FileUri:=TJNet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(sArqEnv1)));
iArq:=0;
ListArqs.add(iArq,FileUri);
FileUri:=TJNet_Uri.JavaClass.fromFile(TJFile.JavaClass.init(StringToJString(sArqEnv2)));
inc(iArq);
ListArqs.add(iArq,FileUri);
IntentWhats := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_SEND);
IntentWhats.setType(StringToJString(‘text/plain’));
IntentWhats.putExtra(TJIntent.JavaClass.EXTRA_TEXT,StringToJString(mensagem));
//para audio (‘audio/mp3’) ou (‘audio/mpeg3’) ou ainda (‘audio/*’)
IntentWhats.setType(StringToJString(‘image/jpg’));
IntentWhats.putParcelableArrayListExtra(TJIntent.JavaClass.EXTRA_STREAM,ListArqs);
IntentWhats.setPackage(StringToJString(‘com.whatsapp’));
//compartilhar diretamente com o WhatsApp
SharedActivity.startActivity(IntentWhats);
//substiua a próxima linha pela a anterior se quiser ter a opção de escolher com qual app compartilhar
//SharedActivity.startActivity (TJIntent.JavaClass.createChooser(IntentWhats,StrToJCharSequence(‘Compartilhar com?’)));
end;
Interessante…
Como fazer tudo isto funcionar no IOS?
Olá Rogério… Eu não me aventurei no universo da Maçã… Infelizmente não conseguirei auxiliá-lo.
De qualquer forma, obrigado por sua participação!
Olá Rogério, pesquise pela ação “ShowShareSheetAction” vai fazer oq você precisa, tanto para Android quanto para iOS, podendo escolher qual app de compartilhamento que você tem instalado no seu dispositivo, como o WhatsApp, Messeger, Skype e todos os outros. Eu uso, porém até o memento não consegui compartilhar mais de uma imagem, um arquivo, já no exemplo acima com algumas mudanças eu consegui. Ainda não dediquei muito tempo para poder enviar mais de um arquivo, caso você consiga poste aqui, vai ser uma boa dica.
Além deste tutorial – http://edn.embarcadero.com/article/43382 – você vai encontrar bastante material sobre o assunto.
Oi Landerson e Kelver, blz?
Você sabem como usar a action ShowShareSheetAction, ou tem algum exemplo. Eu preciso comparilhar mais de uma imagem ao mesmo tempo, mas não conigo usando esta ferramenta, já que ela carrega somente uma foto, resumindo preciso carregar algumas fotos e as comparilhar com algum conta do Whats ou outro aplicativo.
Abração.
Vinicius
Grande Vinícius… rapaz você como dono aqui do blog podia parar de fazer pergunta difícil hein?! (risos)
Não sei a certo o conceito seu aí, também não sei a prática… mas seguindo uma lógica estamos falando de um “vetor” de imagens, correto?
Talvez fazendo isso com stream… cara, na boa… me ajuda hein, para de perguntar essas paradas loucas! kkk
Tenta seguir essa linha… e fala aqui se deu certo viu?!
Grande abraço irmão e muito obrigado pela presença!
Quem manda vc ser fera no assunto… rsssssssss
O problema é que até a gora só sei fazer isso pela propriedade Bitmap da Action. Pelo que estou percebendo não consigo colocar um vetor de imagens nessa propriedade.
A Embarcadero só demonstra desta maneira o compartilhamento, pelo menos não encontro diferente. Já pedi ajuda a grande Sarina, mas infelizmente não tive retorno.
Então por enquanto os meus clientes que usam Android estão mais felizes que os que usam iOS. O ruim é quando no mesmo cliente tem usuários de das duas plataformas e não entendem pq no Android rola e no iPhone não.
Eu vou seguir tentando, mas não com todas as minha energias, em momentos de folga – rsssss – Quando e se conseguir vou postar aqui rapidamente como fiz com a função para Android que você gentilmente deixou publicado nessa sua ótima fonte de pesquisa para aventureiros como eu.
Olá , Landerson e Vinicius !
Adoro os artigos de Vocês , sempre me ajudam muito !
Estou com um dúvida e peço a ajuda de vocês se possível. Estou tentando executar um aplicativo já instalado no celular , através da minha aplicação . Já procurei em todos os lugares e não consegui uma solução que conseguissem implementar .
Se puderem me ajudar agradeço muito .
Desde já , Obrigada
Olá Carolina… primeiramente seja muito bem vinda, e obrigado por sua participação!
Em relação a sua dúvida, você precisa primeiro certificar-se do nome do pacote do aplicativo, em seguida “chamá-lo”…
Creio que esta postagem possa te ajudar a resolver o problema: https://landersongomes.com.br/embarcadero/delphi/checar-se-pacote-esta-instalado-no-android-com-delphi-xe7.
Tente aí e não deixe de dar um feedback nos comentários depois.
Mais uma vez obrigado por sua leitura e participação aqui no blog.
Até a próxima!