Search code examples
androidservicesmsbroadcastreceiver

Broadcast Receiver not processing SMS's


I've seen on SO that @Commonsware states that all that is needed to receive SMS's is a Broadcast Receiver (i.e., without the use of a service). I'd like to employ that approach since it makes sense to me. Unfortunately it does not appear as if SMS's are being received/processed in my Broadcast Receiver. The apk is being installed successfully but no log entries are being generated when I send test SMS's. What am I doing wrong?

Here's the Manifest:

    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="net.oheller.pete2"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="17" />

    <uses-permission android:name="android.permission.SEND_SMS" />
    <uses-permission android:name="android.permission.RECEIVE_SMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/icon_broadcastreceiver"
        android:label="@string/sms_broadcastreceiver"
        android:theme="@style/Theme.eagleeyeactionbar" >

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

        <provider
            android:name=".contentprovider.GPSTrackerContentProvider"
            android:authorities="net.oheller.pete2.contentprovider"
            android:grantUriPermissions="true"
            android:multiprocess="true"
            android:permission="true" >
        </provider>
    </application>

</manifest>

Here's the SMS Receiver code. It's purpose is to collect data via SMS's and write a record of each to the content provider (SQLite database).

public class SMSReceiver_Test extends BroadcastReceiver { 
TelephonyManager telephonyManager;
String deviceCountryCode = "";

@Override
public void onReceive(Context context, Intent intent) {
    //Get the SMS message passed in from the intent
    Bundle SMSmessageContent = intent.getExtras();
    SmsMessage[] receivedSMS = null;
    String returnStr = "";
    Long current_time_stamp = Calendar.getInstance().getTimeInMillis();
    String curTimeString = getFormattedDate(current_time_stamp, "dd-MMM-yy h:mma");     

    telephonyManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);       

    String incoming_SMSphone_number = "";
    String SMSmsgText = "";
    long timeStamp = current_time_stamp;

    if (SMSmessageContent != null) {  // [IF valid SMS]
        //Retrieve the SMS message info
        Object[] pdus = (Object[]) SMSmessageContent.get("pdus");
        receivedSMS = new SmsMessage[pdus.length];
        for (int i=0; i<receivedSMS.length; i++) {  // [FOR get SMS content]
            receivedSMS[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            incoming_SMSphone_number = receivedSMS[i].getOriginatingAddress().toString().trim();
            SMSmsgText = receivedSMS[i].getMessageBody().toString();
            returnStr += curTimeString +"\n";

Log.d("EagleEye", String.format("SMSReciever: SMS=\"%s\"", SMSmsgText))  ;  ///DEBUG
        }  // [ENDFOR get SMS content]

            ///////////////////////////
            // prepare values for insertion into the SQLite DB
                ContentValues GPSTrackValues = new ContentValues();
                GPSTrackValues.put(GPSTrackerTable.COLUMN_PHONE_NUMBER, incoming_SMSphone_number);
                GPSTrackValues.put(GPSTrackerTable.COLUMN_TIME_STAMP, timeStamp);

 //// Prepare access to content provider
                Uri GPSuri = GPSTrackerContentProvider.CONTENT_URI_GPS_Tracks; //specify the content provider location
                ContentResolver GPSTrackCR = context.getContentResolver();          

                // Insert new entry into DB
                Uri insertURI = GPSTrackCR.insert(GPSuri, GPSTrackValues);      
Log.d("EagleEye", "DB insert results="+insertURI)  ;  ////////DEBUG

    }  // [ENDIF Valid SMS] 
}  // [END onReceive]
   }  // [END SMSReceiver]

Solution

  • Code seems to me correct. You can try by increasing the priority by max ..

     <intent-filter android:priority="2147483647">
    

    There may be case , when other receiver is getting sms before yours and aborting them.