views:

2048

answers:

3

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.

+6  A: 

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..

Samuh
+6  A: 

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.

Christopher
In case you are using Eclipse with ADT, you can avoid such errors by adding permissions using the Permission Tab that the Manifest Editor provides rather than typing them yourself.
Samuh
While Samuh is correct, the fact I had misspelled it was what was stopping it from working. Thanks!
Andrew Koester
A: 

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)

Christoph
Not only does the method I wrote still work on 2.1, it's identical to the article linked in your post, and that article was written well before I asked my question. Don't try and confuse people.
Andrew Koester
It's android.telephony.gsm.SmsMessage that's deprecated:http://developer.android.com/reference/android/telephony/gsm/SmsMessage.htmlandroid.telephony.SmsMessage does, indeed, work fine in as far up as 2.2.Interesting, Christoph's link actually references android.telephony.gsm.SmsManager, which is also deprecated.
ydant