12
votes

I'm trying to write a simple application that attempts to receive SMS messages and handle them. I've followed several tutorials but I'm getting nowhere, when I send a SMS to the emulator, the Intent never seems to get fired.

Here is my intent:

package com.neocodenetworks.smsfwd;

import android.content.*;
import android.os.Bundle;
import android.telephony.*;
import android.util.Log;

public class SmsReciever extends BroadcastReceiver {
    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String TAG = "smsfwd";

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.i(TAG, "Intent recieved: " + intent.getAction());

        if (intent.getAction() == SMS_RECEIVED) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {
                Object[] pdus = (Object[])bundle.get("pdus");
                final SmsMessage[] messages = new SmsMessage[pdus.length];
                for (int i = 0; i < pdus.length; i++) {
                    messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
                }
                if (messages.length > -1) {
                    Log.i(TAG, "Message recieved: " + messages[0].getMessageBody());
                    NetComm.SendMessage("me", messages[0].getOriginatingAddress(), messages[0].getMessageBody());
                }
            }
        }
    }
}

and here is my AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.neocodenetworks.smsfwd"
        android:versionCode="1"
        android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name" android:debuggable="true">
        <receiver android:name=".SmsReciever">
            <intent-filter>
                <action android:name="android.provider.telephony.SMS_RECIEVED"></action>
            </intent-filter>
        </receiver>
    </application>
    <uses-sdk android:minSdkVersion="6" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
    <uses-permission android:name="android.permission.RECEIVE_SMS"></uses-permission>
</manifest>

I'd really appreciate some guidance with what's going wrong. I'm just getting into Android development but I think I have my head wrapped around (most of) it. While monitoring the emulator's logcat, the log events never come up, and debugging breakpoints are never hit, so I have a feeling it's somewhere in my intent filter.

I'm running this on Android 2.0.1.

5
I am doing something similar HERE!!! stackoverflow.com/questions/14452808/… - Etienne Lawlor
For more suggestions into why an SMS broadcast received isn't being fired, see this post: stackoverflow.com/questions/4117701/… - TheIT

5 Answers

10
votes

In addition to Samuh's answer (you need to do an object comparison on the action string, or just do no comparison), in your manifest file you have misspelled SMS_RECEIVED.

10
votes

I think your manifest looks okay; the problem is with the line:

if (intent.getAction() == SMS_RECEIVED) {

I think it should be: intent.getAction().equals(ACTION)

Hope that helps..

1
votes

The action name seems to require a capital "T" in "Telephony.

android.provider.Telephony.SMS_RECEIVED

1
votes

For String variables you should not compare with == symbol, you should compare with equals() method

this is wrong

intent.getAction() == SMS_RECEIVED) 

this is right

intent.getAction().equals (SMS_RECEIVED)) 
-1
votes

Since telephony is deprecated (since 1.0 I think), this method doesn't work anymore. Check out this tutorial if you need a proper solution: http://mobiforge.com/developing/story/sms-messaging-android (Just wanted to note this, since I stumbled upon a lot of tutorials that don't work anymore)