Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Tratar corpo da mensagem SMS recebida

Prezados, boa tarde!

Me encontrei em uma situação de um app que, ao clicar em um botão, será enviado para o cel uma mensagem SMS com um código de acesso no corpo da mensagem. criei o código abaixo:

public class SmsReceiver extends BroadcastReceiver {
    private static SmsListener mListener;
    private static String telTeste = String.valueOf(15095);

    SmsMessage sms;



    @Override
    public void onReceive(Context context, Intent intent) {

        Object[] pdus = (Object[]) intent.getExtras().getSerializable("pdus");
        String format = (String) intent.getExtras().getSerializable("format");

        byte[] pdu = (byte[]) pdus[0];

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            sms = SmsMessage.createFromPdu(pdu, format);
        } else {
            sms = SmsMessage.createFromPdu(pdu);
        }

        String sender = sms.getDisplayOriginatingAddress();
        String message = sms.getMessageBody();


        if (telTeste.equals(sender)) {
            MediaPlayer mp = MediaPlayer.create(context, R.raw.musica_empresa);
            mp.start();
        }
    if (message.contains("Insira o codigo do livro")) {
            message = message.replaceAll("[^0-9]", "");
        }
  }

Agora, na Intent, precisaria recuperar o valor de "message" para setar em uma Intent, conforme essa regra:

@Override
        public void afterTextChanged(Editable s) {
    //recuperar a mensagem, colocar no TextView para fazer as comparações abaixo
            if (s.length() >= minimoCaracteres) {
                etCodigoAtivacao.setValidado();
            } else {
                etCodigoAtivacao.limparValidacao();
            }
            habilitarBotaoContinuar();
        }

A duvida é: como posso recuperar o valor da variável mensagem do onReceive, para tratá-la nessa classe da minha Activity?

Obrigado!

3 respostas

Flavio, tudo bem ?

Cara não entendi muito bem o que você quer fazer, me explica um pouquinho melhor ai talvez consiga te instruir a fazer algo.

Opa!

Vou tentar melhorar a pergunta

No meu SMSReceiver, no método onReceive, tenho :

public class SmsReceiver extends BroadcastReceiver {
    private static SmsListener mListener;
    private static String telTeste = String.valueOf(15095);
    String codSms;

    SmsMessage sms;

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i("TESTASMS", "Chegou o SMS");

        Object[] pdus = (Object[]) intent.getExtras().getSerializable("pdus");
        String format = (String) intent.getExtras().getSerializable("format");

        byte[] pdu = (byte[]) pdus[0];

        if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
            sms = SmsMessage.createFromPdu(pdu, format);
        } else {
            sms = SmsMessage.createFromPdu(pdu);
        }

        String sender = sms.getDisplayOriginatingAddress();
        String message = sms.getMessageBody();


        if (telTeste.equals(sender)) {
            MediaPlayer mp = MediaPlayer.create(context, R.raw.mus_livraria);
            mp.start();

            if (message.contains("Insira o codigo do livro")) {
                codSms = message.replaceAll("[^0-9]", "");
                Log.i("Receiver",codSms);
            }
        }
    }

Até aqui ok: Li o SMS e, quando a mensagem contém "Insira o código do livro", ele cria uma variável que só contém o código do livro comprado.

O problema é: preciso extrair essa variável com o valor do código para outra Intent, e setá-la num TextView.

Como o OnReceive não tem retorno, como poderia passar essa variável só com o código (codSms) para a classe da Intent?

solução!

Agora entendi o que você quer fazer, rs.

Dado que você tem o código, a galera geralmente usa o lance de eventos para esse tipo de coisa, existe uma bilbioteca chamada EventBus que faz o papel de disparar esses eventos:

http://greenrobot.org/eventbus/

Acho que você pode ir por esse caminho, só precisa tomar cuidado, precisa ter certeza que seu usuário vai estar na tela exata que você quiser.