Acho que uma das funcionalidades mais legais de um celular é sua interação por troca de mensagens, vulgo SMS. Tentarei explicar como podemos enviar mensagens pelo Android, nunca se sabe quando precisaremos criar nossa própria interface de SMS, afinal, o Android é "Open Source". Nada impede que você mesmo crie suas interfaces, seja um PLAYER, SMS SYSTEM, ALARME, CRONOMETRO, CALCULADORA...
App SMS - (BroadcastReceiver)
Diagrama: Basicamente, nós precisamos apenas de uma Activity com um layout que contenha um EditText, que no caso seria a mensagem a ser enviada, e um Button para enviar a mesma. Também precisaremos de um BroadcastReceiver que irá identificar quando um evento de SMS chegasse ao aparelho. E o mais importante, uma Classe model que auxiliará no envio/recebimento da mensagem.
PrincipalActivity.class: Nada muito difícil, né? EditText + Button (implementando OnClickListener). Quando você clicar em enviar, você enviará o SMS através da sua Classe model pegando o texto digitado no EditText através do editText.getEditableText().toString(); e logo em seguida, enviando a mensagem.
-> Não esqueça do toString(), pois quando damos um getEditableText() ou getText(), é retornado um Objeto do tipo Editable e não do tipo String.
-> Perceba que no método de envio, passamo os parâmetros do seguinte modo: enviarSms(numero, mensagem). Você deve estar se perguntando agora, porque está "5554" como parâmetro, número de envio? Se você rodar seu emulador, você vai perceber que la em cima na aba está escrito 5554:NOME_DA_AVD, ou seja, 5554 é o número de "celular" deste emulador. Se você rodar outro emulador em conjunto com outro, vai ter 5554:AVD_1 e 5556:AVD_2, assim por diante...
-> Depois testa enviar SMS de um Emulador para outro, apenas mudando o parâmetro e instalando o aplicativo em ambas AVD's. =)
MeuReceiver.class: Nosso broadcastReceiver irá apenas receber o SMS enviado, ler quem enviou (ORIGEM) e exibir o corpo da mensagem em um Toast ("Pop-up"). Isso, para toda a vez que chegar um SMS e mesmo que a Activity não esteja rodando.
-> Classe android.telephony.SmsMessage: Ela suporta ambos os tipos de frequência existentes no Brasil (CDMA e GSM). Nada mais é do que um Objeto que guarda todas as informações de SMS/EMAIL que foi enviado por um usuário, como corpo da mensagem, remetente, etc...
SMSHelper.class: Está classe possuirá dois métodos, enviarSms(String numero, String mensagem); e getMessageFromIntent(Intent it);.
OBS: NÃO ESQUEÇA DE COLOCAR NO MANIFESTO AS PERMISSÕES PARA ENVIO E RECEBIMENTO DE SMS E TAMBÉM DE CADASTRAR SEU BROADCASTRECEIVER COM A ACTION DE RECEBIMENTO DE SMS.
-> Classe android.telephony.SmsMessage: Ela suporta ambos os tipos de frequência existentes no Brasil (CDMA e GSM). Nada mais é do que um Objeto que guarda todas as informações de SMS/EMAIL que foi enviado por um usuário, como corpo da mensagem, remetente, etc...
SMSHelper.class: Está classe possuirá dois métodos, enviarSms(String numero, String mensagem); e getMessageFromIntent(Intent it);.
- enviarSMS(String numero, String mensagem):
-> Classe SmsManager: É a classe que a operação de envio de mensagens em 'pdus'. O Android utiliza o formato de mensagens em PDU, por isso que ao recebermos a mensagem, lemos a informação extra da Intent chamada “pdus”. Após isso utilizamos o método createFromPdu() da classe SmsMessage, para transformar a mensagem pdu em um objeto SmsMessage, para podermos manipulá-lo.
Feito tudo isso, vamos partir para o envio de SMS. Para enviar uma SMS é muito simples, tudo que precisamos fazer é pegar uma instancia de SmsManager e utilizar o método de envio de mensagem.
- getMessageFromIntent(Intent it):
-> Neste método, guardamos todas as mensagens que estão contidas na Intent que inicializou o broadcastReceiver e posteriormente iremos guardar cada mensagem e uma posição do array. Feito isso, só precisamos retornar o array de SmsMessage para nossa PrincipalActivity e pronto!!!!!
OBS: NÃO ESQUEÇA DE COLOCAR NO MANIFESTO AS PERMISSÕES PARA ENVIO E RECEBIMENTO DE SMS E TAMBÉM DE CADASTRAR SEU BROADCASTRECEIVER COM A ACTION DE RECEBIMENTO DE SMS.
Espero ter explicado bem,
Abraço,
-----------------------------
Fonte:
parabeeens cara, gostei muito. Funcionou de boa. Valeu.
ResponderExcluirOlá, Felipe! Valeu cara, estava precisando muito de um código desses, sou iniciante no Android e este post ajudou muito. Apenas uma coisa não me ficou clara: a parte final, "NÃO ESQUEÇA DE COLOCAR NO MANIFESTO AS PERMISSÕES..."
ResponderExcluircomo sou iniciante isso me parece Grego. Em que parte do código eu faço isso? Desde já obrigado.
Opa, que bom que o código ajudou vocês...
ResponderExcluirPara adicionar no manifesto é só você abrir o arquivo AndroidManifest.xml, ir na aba PERMISSÕES e adicionar 'uses permission'.
Tem no final do post imagens mostrando os valores.
Abraço.
Muito bom, cara! Foi a primeira classe que funcionou de verdade pra receber SMS que eu achei! Agora só falta uma que envie de verdade! rs..
ResponderExcluirO envio de SMS real precisasse de mais configurações.
ResponderExcluirAs operadoras utilizam números de suporte. Da uma pesquisa maior. :)
Abraço
e como eu faço para que envie um sms real, você sabe que configurações são essas? eu estou fazendo uma aplicação que só precisa enviar um sms caso um recurso não seja desativado. Espero que possa me ajudar nisso.
ExcluirAnônimo,
ExcluirCom o código acima, você já envia a mensagem.
A única coisa que você deve ter cuidado é com o tamanho do texto, se não me engano uma mensagem sms pode ter no máximo 40 caracteres, se exceder esse tamanho, utilizando o método sendTextMessage em SmsHelper vai travar, mas nada que seja dificil de se ajeitar.
É só utilizar o método sendMultipartTextMessage, e no texto que você quer você divide ele em uma lista de String utilizando o método divideMessage que está em seu SmsManager!
Abraço!
LEGAL.
ExcluirVLwwwww
Excelente post.
ResponderExcluirFelipe, Parabens, realmente eh top,
ResponderExcluirmais ve se pode me dar uma dica,
para para pegar uma sms enviado via
normal sem ser na sua aplicação,
conseguindo fazer igual a sua aplicação que
mesmo sem esta rodando o Activity ela demostrar?
Pelo o que eu entendi você quer que uma notificação seja lançada quando um SMS chegar no aparelho, correto?
ResponderExcluirVocê precisa utilizar um BroadcastReceiver com ação RECEIVE_SMS e depois no método onReceive do BroadcastReceiver você lança a notificação!
Espero ter ajudado,
Abraço!
Muito Obg, consegui pegar ao msg recebida na hs exatamente oq eu qeria, com seu codigo n deu erro mais ! vlw.
ResponderExcluirMeu tcc agradece :+)
Galera como faço para enviar sms para emuladores em maquinas diferentes? por exemplo estou em uma rede onde tenho um PC1 192.168.1.10 E PC2 192.168.1.20 estou rodando o meu aplicativo nas duas maquinas mas quero trocar sms entre elas?
ResponderExcluirPreciso urgente configurar isso...
valeu galera!
Oi Anônimo, tudo bom?
ResponderExcluirEntão, eu não sei se existe essa possibilidade pois as mensagens que são trocadas entre emuladores NO MESMO pc, ocorre através da id do mesmo.
Tenta procurar algo no fórum do Google Android.