Nessa postagem vamos enviar SMS através de uma aplicação Delphi XE5 para Android. Poucas linhas de códigos que podem ser adaptadas à realidade de sua aplicação mobile e torná-la ainda mais agradável a seus usuários.
Criação da Interface da aplicação e Conceder Permissão para Envio de SMS
Inicie o Delphi XE5 e crie um novo projeto Mobile em Branco como já fizemos em outras postagens, acesse Menu File –> New –> FireMonkey Mobile Application e em seguida selecione a opção Blank Template .
Vamos inserir em nosso formulário 1 Label, 1 Edit, 1 Memo e 1 Button. Alteraremos a propriedade Text do Label para “Destinatário”. Ao final teremos a interface da aplicação assemelhando-se à figura abaixo:
Como vamos enviar SMS, precisamos solicitar essa permissão ao Android. Abre-se aqui um parêntese, quando você instala uma aplicação no Android ele sempre informa os recursos que essa aplicação vai usar, por isso vamos setar a permissão para Envio de SMS como verdadeira. No Project Manager selecione o nosso Projeto e clique com o botão direito para que seja exibido o Popup Menu e nele selecione Options (a penúltima opção do menu popup).
As opções do Projeto serão abertas e aí procuraremos por Uses Permissions, note que no quadro à direita estão todas as opções de permissões possíveis a um projeto Android. Vamos procurar nas permissões por Send SMS e setá-la para True, ou seja, acabamos de dizer para o Android que usaremos o envio de SMS.
Feito isso basta clicar em OK e vamos iniciar a codificação de nosso projeto.
Código Delphi… funcionalidade Android
Na seção Implementation, em sua cláusula uses vamos adicionar 2 Namespaces que fazem referências a Classes Android e farão com que nosso projeto se comunique com o telefone e reconheça os tipos de dados do Android/Java, são eles respectivamente abaixo:
implementation
{$R *.fmx}
uses Androidapi.Jni.Telephony, Androidapi.Jni.JavaTypes;
No evento OnClick do Button vamos inserir o seguinte código:
procedure TForm1.btnEnviarClick(Sender: TObject);
var
GerenciadorSMS : JSmsManager;
begin
GerenciadorSMS := TJSmsManager.JavaClass.getDefault;
if not Edit1.Text.IsEmpty then
begin
if not Memo1.Lines.Text.IsEmpty then
GerenciadorSMS.sendTextMessage(StringToJString(Edit1.Text), nil, StringToJString(Memo1.Lines.Text), nil, nil )
else
ShowMessage('Escreva a mensagem.');
end
else
ShowMessage('Informe o número de destino para a mensagem.');
end;
Já está pronta nossa aplicação. Acione o Emulador ou conecte um dispositivo Android e execute para conferir o funcionamento.
Traga para sua realidade
Na minha postagem Delphi XE5 Efetuando chamadas telefônicas direto de sua aplicação móvel, populamos um ListBox com elementos de um cadastro de fornecedores fictício e a partir dali efetuávamos chamadas telefônicas. Na postagem de hoje, poderíamos pensar de igual forma, com um cadastro de Gerentes ou Vendedores de sua empresa por exemplo e que você precise enviar um SMS a eles.
Enfim, a facilidade está disponível, adapte-a à realidade de seu usuário.
Até a próxima.





Parabéns pelos artigos.
Obrigado por compartilhar seu conhecimento!
Ótimo, parabéns pela forma limpa e clara da explicação.
Olá Diego… espero que tenha ajudado.
Tenho postado uma série de artigos contendo situações que são usuais em quase todo tipo de projeto que venhamos a desenvolver.
Muitas das vezes são dúvidas minhas mesmo e que quando encontro uma maneira de solucionar posto.
Obrigado pelo comentário.
Um abraço.
Landerson , aproveitando …
O que tem achado desta nova forma de programação para mobile com o Delphi ?
Venho discutindo com alguns amigos desenvolvedores e ainda existe muito preconceito com o Delphi principalmente agora que ele desenvolve para Android.
Abraço.
Bem Diego sempre vimos preconceitos em relação a determinadas linguagens e o Delphi por muitas vezes fica do lado de “vítima”.
Na verdade sempre fui a favor da utilização da linguagem que atenda a necessidade proposta. Trabalhei com sistemas em clipper que o faziam perfeitamente. Fazendo uma análise em tempos atuais a velocidade para entregar projetos chega a ser mais prioritária do que a própria qualidade do projeto em si. O Delphi é essencialmente RAD, ou seja, ele se propõe a ser ferramenta para desenvolvimento rápido desde sua criação e o faz com excelência a meu ver. Nesses novos ambientes temos a mesma forma RAD Delphi de ser, talvez um ponto que precise muito ser melhorado é o “tamanho” das aplicações e acredito que estejam trabalhando nisso. No mais, a meu ver, o cliente nunca quer saber em que linguagem foi escrita a aplicação, ele quer estar satisfeito, e quando ele precisar, a ferramenta esteja disponível de maneira satisfatória.
Eu vejo assim, e olha que os clientes no meu caso, são todos clientes internos, de dentro da própria empresa, que consomem programas meus em Delphi, ADVPL, clicou? funcionou? A meu ver é o que importa, obviamente, temos que levar em conta a evolução, a otimização e isso eu costumo fazer antes de decidir por qual ferramenta vou desenvolver.
Ficou meio longa a resposta, mas é um tema que uma sequência de postagens não esgotaria.
Você e seus amigos, chegaram a alguma conclusão? Seguem outra linha de pensamento diferente ao meu?
Se ficar muito grande acredito que teremos que fazer um post sobre isso convidando alguns amigos a opinarem.
Um abraço e obrigado pela “audiência”.
Eu sou novo na área Landerson, mas confesso que sou bem curioso ressaltando que sempre procuro a mais rápida e simples forma de Desenvolvimento. Desde que ingressei na área repudiava o Delphi, e hoje estou aproximadamente 1 ano mexendo com ele e cheguei a conclusão que a linguagem Delphi é rica, se pode fazer de tudo, mas confesso também que ela deixa a desejar em muitos itens como orientação a objeto, IDE que nunca evolui ajudando os usuários, compilação lenta e desinteligente e seus diversos erros não catalogados. Delphi está ficando pra trás não por ser ruim, mas por estar aparecendo coisas novas e inovadoras facilitando o Desenvolvimento e principalmente a manutenção de softwares.
Hoje tenho repulsa de Java, Linguagem bonita, fácil porém lenta pra Desenvolver… um projeto em Java 6 meses, em Delphi 2 meses… Ambos farão tudo da mesma forma.
Grade abraço e aguardo novos post’s.
Caro amigo Landerson, estou tentando executar este exemplo de SMS no DELPHI XE6, mas não está localizando a função StringtoJString. Você sabe me dizer se esse código só funciona no XE5? Desde já agradeço.
Olá Wagner tudo bem? Na verdade eu que agradeço sua participação aqui no blog. Com relação à função StringtoJString ela converte uma string Delphi Language para String do tipo Java… mas enfim, sempre que trabalhamos com ambiente Android é interessante e quase imprescindível declararmos as uses:
No XE6 ainda não utilizei, mas acredito que o problema esteja nessa desclaração de uses, dá uma conferida e sinaliza se deu certo.
Um abraço e mais uma vez obrigado pela participação!
Ola Wagner, no XE6 utilize JString no logar de StringtoJString.
adicione ao uses Androidapi.Helpers,
Ola Pessoal! Quem esta tendo dificuldades para compilar o exemplo no Delphi XE6… apenas acrescente no USES “Androidapi.Helpers”
;D
Boa tarde.
Gostaria de parabenizá-lo pelas informações divulgadas de forma gratuita e bem clara. Mas, tenho uma dúvida que acho que muitos também devem ter. Para envio de SMS é utilizada a procedure sendTextMessage com alguns parâmetros e gostaria de saber como é que obtenho a informação de que a mensagem foi enviada ou não ? Tenho essa dúvida porque fiz um pequeno programa de cobrança onde o operador confirma o pagamento do cliente e automaticamente o programa envia um sms para um número telefônico pré-definido no sistema. Atualmente está enviando normalmente os sms, mas a minha dúvida é: Quando o operador estiver em um local sem sinal da operadora os SMS não poderão ser enviados. Como saberei se houve sucesso no envio ? Os sms ficarão armazenados para envio quando estiver em algum local com sinal da operadora ?
Aguardo suas orientações e obrigado.
Olá Silvio… em primeiro lugar obrigado por sua participação! Quanto aos parabéns, também agradeço… na verdade no blog posto todas dificuldade já vivenciadas por mim no desenvolvimento de alguns projetos em meu cotidiano. Com relação a sua dúvida, vou tentar dar uma pesquisada, francamente nunca precisei fazer uso de tal checagem, mas é uma questão estremamente pertinente. Um método que costumo utilizar para resolver esses tipo de problema em delphi é checar como isso é resolvido em JAVA/ANDROID, lá, por ser um ambiente nativo e mais maduro, já que em Delphi tudo ainda é novidade.
Conforme falei vou dar uma pesquisada aqui de acordo com minha disponibilidade e achando algo te envio ou publico.
Mais uma vez obrigado pela participação.
Um abraço!
Muito bom!
Me ajudou bastante, mas preciso enviar, também, pelo iPhone.
Você sabe como?
Olá Rafael… infelizmente eu não cheguei a trabalhar em nada para o i-Phone, e como aqui trato apenas situações que já tenham sido vivenciadas por mim no cotidiano, no meu caso o foco é todo em Android.
Espero que encontre a solução para i-Phone, de qualquer forma gostaria de agradecê-lo pela participação no Blog.
Obrigado.
Olá Landerson..
Gostaria de realizar o envio de varios sms’s de maneira simultânea, fiz um for de 1 a 100, porem o aplicativo envia apenas uma parte dos sms’s…. para ser mais preciso, nao passam de 15!
Testei com varias versões do android, e tive mesmo problema!
Tem ideia do que possa ser? Fico muito agradecido!
Olá Dionemar… será que existe algum limite de intervalo no envio???
Tente capturar quanto tempo está demorando nesses 15… depois tente enviar o mesmo SMS por mais de 15 vezes manualmente, pode ser isso?
Sinceramente não sei se existe tal limitação, com relação a e-mail sei que provedores têm essa prática.
Caso note que é isso, coloque um timer na aplicação enviando 1 a cada 30 segundos por exemplo, talvez resolva.
Obrigado mais uma vez pela participação e boa sorte aí!
Um abraço.
Landerson meu caro, muito agradecido pelo seu retorno! Pois entao, segui os procedimentos como me falou para fazer…
Antes eu estava fazendo da seguinte maneira:
dm.fdquery01.first;
while not dm.fdquery01.eof do
SendSMS(dm.FDQuery01.FieldByName(‘nrofone’).AsString,
memo1.Lines.Text);
Sleep(15000);
Application.ProcessMessages;
dm.FDQuery01.next;
end;
Como o Timer, tive um resultado pouco melhor, entretanto ainda estou tendo o mesmo problema…
Será que não estou “sobrecarregando” muito o envio de SMS?
Quero dizer, é estranho porque ele envia perfeitamente os primeiros, depois o aplicativo continua executando mas nao recebo mais os SMS no outro celular!
Saberia me dizer algo provável que esteja acontecendo?
🙂 fico muito agradecido!
Dionemar… a minnha conclusão é exatamente essa. Deve haver um limite de sms por tempo, acredito eu que seja “pago” para passar desse limite.
O ideal talvez seja o contato com a operadora e perguntar se é procedente nossa conclusão. Caso positivo, em qual setor você “resolve” isso.
Enfim… vai precisar de tempo para resolver uma vez que os atendimentos nessas operadoras nossa é bem similar ao serviço que elas entregam.
Abraço.
Dionemar, conseguiu resolver o problema com o banco meu amigo, estou tentando a mesma coisa e esta dando erro.
Landerson meu amigo, boas novas! Como quem espera sempre alcança!!! Aqui estou….
Desculpe por mais uma vez eu escrevendo, mas….. Descobri o problema, porem acho que preciso de ajuda para buscar a solução!
Não era nada referente a quantidade de SMS’s e sim o aplicativo android muito pesado!
Observe meu teste em outra aplicacao nova que criei:
var
i : integer;
begin
for I := 0 to 100 do
begin
SmsCount := SmsCount +1;
SendSMS(‘XXXXXXXXXXX’,’Teste de Envio de SMS ‘+IntToStr(SmsCount)+’.’);
Sleep(3000);
lbSend.Text := ‘SMS Enviados: ‘+IntToStr(SmsCount);
end;
Cara, funcionou perfeitinho!
PROBLEMA: Quando integro a aplicação com banco de dados(FIREDAC/Sqlite), acredito eu que o aplicativo utiliza muito processamento, ou seja fica muito lento, assim creio que o aplicativo android não esta atendendo a demanda!
SOLUCAO???
Sera que estou certo em minha conclusão?
Teria como deixar o aplicativo mais leve??
ou encontrar alguma maneira que prosseguir com o envio nao aumentando o consumo de memória??
Dionemar que bom que conseguiu evoluir aí! Sinceramente acreditava que seria uma limitação da operadora, seu progresso desmentiu esse “mito”.
Bem, quanto a questão do “peso” da aplicação, você poderia tentar criar um form novo, nele enviar a mensagem, destruir e isso tratado dentro de um loop.
Assim você terá controle de quanto realmente estará aumentando de memória (criar o novo form e enviar) e quando você libera memória e destrói voltando assim ao “consumo original”, e no novo ciclo você começaria de novo do mesmo “tamanho”.
Acho que pode dar certo, tente aí.
Acredito que seguindo essa linha em seus teste você vai atingir a satisfação aí no seu projeto.
Mais uma vez obrigado pela participação e fico muito contente por seu progresso no projeto.
Abbração!
Cara tenta utilizar uma thread para esse processo, processos demorados deve ser feito desse jeito. Da uma pesquisada na net sobre isso que deve te ajudar. Blz!
se vc usar uma Thread não resolve o peso do aplicativo?
ola amigo sou novo no delphi mobile, e esse exemplo de erro na seguinte parte
uses Androidapi.Jni.Telephony, Androidapi.Jni.JavaTypes;
esse e o erro
[DCC Error] Unit1.pas(31): E2004 Identifier redeclared: ‘Androidapi.JNI.Telephony’
[DCC Error] Unit1.pas(31): E2004 Identifier redeclared: ‘Androidapi.JNI.JavaTypes’
[DCC Fatal Error] SMS.dpr(7): F2063 Could not compile used unit ‘Unit1.pas’
Failed
Elapsed time: 00:00:02.1
Olá Marllone, seja bem vindo!
Conseguiu achar algum erro aí? Acredito que você esteja cometendo algum erro de configuração.
Tente dar uma revisada, qualquer coisa volte a postar aqui.
Obrigado aí pela participação!
Estou com o mesmo problema do Marllone, a uses não localiza essa unit….
Androidapi.Jni.Telephony, Androidapi.Jni.JavaTypes;
Ao compilar dá o seguinte erro:
[dcc32 Fatal Error] HeaderFooterFormwithNavigation.pas(55): F1026 File not found: ‘C:\Desenv\XE7\SMS\Androidapi.JNI.Telephony.dcu’
No meu caso estou com o XE7, com o ambiente multi-device app !
Olá Elvys… bem vindo!
Consegue verificar se está com a plataforma Android selecionada no Target? Acabo de refazer o exemplo da postagem usando o XE7 e não obtive a mensagem em momento algum.
Aguardo nova interação sua e desde já agradeço sua participação!
Olá Landerson! Parabéns pelo post. Gostei muito!
Você sabe o caminho das pedras para interceptar a recepção de um SMS para então tratá-lo dependendo do conteúdo da mensagem? Obrigado desde já!
Olá Anderson… bem vindo ao blog e obrigado pela participação! Quanto a “leitura” de SMS já cheguei a ver algo sobre isso sim, entretanto era em Ambiente Java, vou dar uma pesquisada e tento fazê-lo em Delphi, caso consiga posto aqui, ok?!
Um abraço.
Uso o XE6 e o exemplo esta dando erro no momento de enviar a msg, o erro é: Access violation at address 77E79F50, accessing address 0032003C, alguem tem ideia do que seja? Estou colocando o numero do telefone assim: DDNNNNNNNN
estou com o mesmo problema :/
Eduardo, mantem o StringToJString e faz uses a Androidapi.Helpers que irá funcionar
Valeu pessoal, funcionou.
Exatamente era este o meu problema. E com a unit Androidapi.Helpers, funcionou! Obrigado.
boa tarde, Landerson Gomes.
Novamente eu por aki aprendendo com seus tutorias. (Salva Vidas).
Deu certo copila direito no xe7 porem na hora de enviar a msg tenho o seguinte erro:
java.lang,SecurityException: Sending SMS message: uid 10338 does not have
android.permission,SEND_SMS.
acho que é alguma coisa com meu aparelho, tenho um note 3.
abraços e novamente o brigado.
Olá Thiago… que bom que tem voltado, sinal que está sendo útil o blog… afinal além de um passa tempo também tenho o intuito de ajudar no que puder contribuir!

Em relação à mensagem de Erro ela parece ser bem explicita, está sem permissão para o envio de SMS… veja que na postagem devemos atribuir essa permissão o ideal seria confirmar o valor da mesma no seu projeto.
No Project Manager selecione o nosso Projeto e clique com o botão direito para que seja exibido o Popup Menu e nele selecione Options (a penúltima opção do menu popup). As opções do Projeto serão abertas e aí procuraremos por Uses Permissions, note que no quadro à direita estão todas as opções de permissões possíveis a um projeto Android. Vamos procurar nas permissões por Send SMS e setá-la para True, ou seja, acabamos de dizer para o Android que usaremos o envio de SMS.Acredito que apenas isso deva resolver!
Poste seu feedback depois!
Até a próxima.
Landerson , boa noite.
Correto sua explicação mais uma vez, enviou o SMS perfeito.
Estou desenvolvendo um aplicativo para help-desk uma coisa simples que sentia falta no meu dia dia e para estudar e conhecer o que a ferramenta nos permita fazer. Gostaria de ver com você se quando terminar você aceita a comentar e documentar o fonte e postar o programa para outras colegas usar como estudo?
obrigado e vou te amolar mais um pouco.
Thiago Gobatti
Pena que não funciona para IOS
Usei todo o exemplo que passou, e funcionou perfeitamente.
Mas acontece um problema quando coloco sua função dentro de um loop. Já realizei testes com While, For, Repeat, TTimer, AppIde do Formulário, Thread, etc. Todo tipo de loop possivel eu realizei mas não estou conseguindo obter sucesso.
Aplicação tem ma lista de SMS em uma tabela local, telefone e msg na lista.
Ao realizar um teste enviando a partir do clique em um botão o SMS chega perfeitamente.
Ao enviar o sms pelo LOOP, o android desconecta os chips do celular, como se intende-se que um procedimento de envio de sms esta acontecendo dentro de um loop e não permiti-se este procedimento.
Realmente não consigo mandar SMS se estiver em loop, eu preciso enviar somente se o código estiver fora dele.
Sabe se existe alguma permissão para liberar este procedimento ou tem conhecimento de alguma técnicas para disparar essas mensagens ?
Eu até cheguei utilizar serviços no android, mas se estiver em loop não deixa.
Agradeço pela resposta!
Conseguiu resolver seu problema colega?
Encontrei o problema o qual relatei acima.
Primeiro eu utilize o comando Application.ProcessMessages; apos o envio, para realizar o disparo no momento exato do processo.
Mas o principal foi o fato de definir um tamanho de mensagem pequena e que não possua caracteres inválidos, pois estou capturando os dados de um xml no servidor.
Agradeço atenção e fica ai minha participação.
Observação, o problema também esta acontecendo por que estava enviando um link (http://www.site.com.br) na mensagem, e o android não enviava a mensagem. fica dica!
Como faço para receber as mensagens pela minha aplicação?
Olá Flavio… já li sobre porém ainda não desenvolvi.
Lembro-me de algo assim nesse link, mas não testei.
Espero que ajude!
Até a próxima!
Atualmente uso o Delphi 10 Seattle e deu erro aqui:
GerenciadorSMS.sendTextMessage(StringToJString(Edit1.Text), nil, StringToJString(Memo1.Lines.Text), nil, nil )
Esse fonte é compatível com o D10?
Olá Gil bem vindo!
Ainda não tentei utilizar via Delphi 10 Seattle, desde a criação deste exemplo acredito que o único problema que possa haver seja a Refatoração ocorrida em que a StringToJString passa a fazer parte da Unit Androidapi.Helpers, assim sendo tente declará-la também no projeto e testar.
Não deixe de postar uma feedback!
Obrigado por sua participação e até a próxima!
Apareceu um erro, fiz no delphi xe7 coloquei no celular aparece access violation at addres 60A087D4.
Olá Thiago… desculpe-me pela demora na resposta.
Em primeiro lugar precisamos salientar que houve refatoração em algumas funções desde o Delphi XE5, assim sendo é necessário alguma alteração.
O problema ainda persiste ou já conseguiu resolver?
Desde já agradeço sua participação.
Ola Landerson Gomes parabens pela sua iniciativa…
tenho uma dúvida como posso saber se o SMS foi enviado ou não?
tipo um retorno…
pois se eu estiver sem credito ira retornar algo?
Ola Landerson Gomes, no meu exemplo de enviando SMS aconteceu o mesmo problema de ‘access violation at addres’ apenas com o código diferente ao do Thiago quando o app e clicado em enviar o sms. Estou altualmente testando o Delphi10 Seatle, que pode ter acontecido?
Problema solucionado erro de digitação do código.
Obrigado.
Enviar SMS foi um sucesso, agora como receber ou listar sms recebidos, pode ser feito? estava pensando do jeito como WhatsApp eles mandam o sms com o codigo e dai o app do whats captura os dados na hora do recebimento.