Android - receiving long SMS (multipart)

I have an application, which has to listen for specific SMS. So far easy.

But when I receive the message, it's multipart. Is there a proper way to receive the SMS as one message?

Now my activity starts two times, for each part of the sms. Should I concatenate the SMS by hand?


Solution 1:

It may be useful to look at how gTalkSMS handles incoming SMS'es, as it appears to handle multipart messages correctly.

Solution 2:

Bundle bundle  = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("pdus");
            messages = new SmsMessage[pdus.length];
            for (int i = 0; i < pdus.length; i++)
            {
                messages[i] =
                    SmsMessage.createFromPdu((byte[]) pdus[i]);
            }

SmsMessage sms = messages[0];
try {
  if (messages.length == 1 || sms.isReplace()) {
    body = sms.getDisplayMessageBody();
  } else {
    StringBuilder bodyText = new StringBuilder();
    for (int i = 0; i < messages.length; i++) {
      bodyText.append(messages[i].getMessageBody());
    }
    body = bodyText.toString();
  }
} catch (Exception e) {

}

Solution 3:

Shorter solution:

if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
                    Bundle bundle = intent.getExtras();           //---get the SMS message passed in---
                    SmsMessage[] msgs = null;

                    if (bundle != null) {
                        //---retrieve the SMS message received---
                        try {
                            Object[] pdus = (Object[]) bundle.get("pdus");
                            msgs = new SmsMessage[pdus.length];
                            String msgBody = "";
                            String msg_from = "";
                            for (int i = 0; i < msgs.length; i++) {
                                msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                                msg_from = msgs[i].getOriginatingAddress();
                                msgBody += msgs[i].getMessageBody();
                            }

                        } catch (Exception e) {
    //                            Log.d("Exception caught",e.getMessage());
                        }
                    }
                }

Solution 4:

Yes you should concatenate the SMS by hand, but obviously you don't want to be starting up a new activity for each message segment.

I suggest setting your Activity's launchMode attribute to singleTask or singleInstance so that that doesn't happen.

Alternatively have your SMS's received by a Service, which will fire up a new Activity only once it has a complete message.

Solution 5:

I am not aware of a way to recive a multipart message as once. But if you have the right intent-filter setup you get only one Intent for more than one SMS. In fact, the Intent can contain SMS from different senders and/or zero or more multipart SMS .

You could try this approach:

Add an SmsReceiver Class with intent-filter android.provider.Telephony.SMS_RECEIVED in the Manifest.

The classes onReceive Method will get an intent with a bundle of pdus. These pdu's can origin from different senders each and/or there can be more pdus from the same sender in case of a multipart text message, which you have to concatenate.