Reputation: 31
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
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
getMessagesFromIntent(Intent)
in your onRecieve
methodfor(SmsMessage message : Telephony.Sms.Intents.getMessagesFromIntent(intent)) {
if (message == null) {
Log.e(tag, "message is null");
break;
}
smsOriginatingAddress = message.getDisplayOriginatingAddress();
smsDisplayMessage = message.getDisplayMessageBody();
}
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