SMS Intents.getMessagesFromIntent(intent) returns null

I'm trying to read SMS on Android. Everything's fine except when I'm trying to access some value in SmsMessage object I'm getting an error:

12-29 17:41:58.762: E/AndroidRuntime(5545): java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.android.internal.telephony.SmsMessageBase.getDisplayOriginatingAddress()' on a null object reference
12-29 17:41:58.762: E/AndroidRuntime(5545):     at android.telephony.SmsMessage.getDisplayOriginatingAddress(SmsMessage.java:517)

I registered Receiver in AndroidManifest.xml, and by extending BroadcastReceiver created class SmsReceiver.

Method where I'm creating SmsMessage objects.

private final SmsMessage[] getMessagesFromIntent(Intent intent) {

    Object[] messages = (Object[]) intent.getSerializableExtra("pdus");
    byte[][] pduObjs = new byte[messages.length][];

    for (int i = 0; i < messages.length; i++) {
        pduObjs[i] = (byte[]) messages[i];
    }

    byte[][] pdus = new byte[pduObjs.length][];
    int pduCount = pdus.length;

    SmsMessage[] msgs = new SmsMessage[pduCount];
    for (int i = 0; i < pduCount; i++) {
        pdus[i] = pduObjs[i];
        msgs[i] = SmsMessage.createFromPdu(pdus[i]);
    }

    return msgs;
}    

Method onReceive

@Override
public void onReceive(Context context, Intent intent) {
    SmsMessage[] messagesArray = getMessagesFromIntent(intent);

    for (SmsMessage message : messagesArray) {

        String sender = message.getDisplayOriginatingAddress(); //the application fails here
        String order = message.getMessageBody().toString();
        //...
    }
}

I've tried method Intents.getMessagesFromIntent(intent) but with no effect

Upvotes: 1

Views: 3737

Answers (1)

Rahul Aswani
Rahul Aswani

Reputation: 85

I registered Receiver in AndroidManifest.xml, and by extending BroadcastReceiver created class SmsReceiver.

Since you haven't posted your AndroidManifest.xml i am assuming you are registering your receiver like this

<receiver android:name=". SmsReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

if not please do it like this

as the Android Documentation for getMessagesFromIntent(Intent) says that it can only be used from API 19 onwards hence ill tell you two methods to extract the sender's phone number and message from a received SMS

1. using getMessagesFromIntent(Intent) in your onRecieve method

for(SmsMessage message : Telephony.Sms.Intents.getMessagesFromIntent(intent)) { 
    if (message == null) { 
        Log.e(tag, "message is null"); 
        break; 
    } 
    smsOriginatingAddress = message.getDisplayOriginatingAddress();
    smsDisplayMessage = message.getDisplayMessageBody(); 
}

2. using PDU (protocol data unit) – the standard industry format for an SMS message

Object[] data = (Object[]) bundle.get("pdus");
for (Object pdu : data) {
    SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);
    if (message == null) {
        Log.e(tag, "message is null");
        break;
    }
    smsOriginatingAddress = message.getDisplayOriginatingAddress();
    smsDisplayMessage = message.getDisplayMessageBody();
}

this should work fine

Upvotes: 4

Related Questions