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]
Your priority might not be good enough, try setting it to 2147483647.
After doing that, try start it in debug mode, and breakpoint in your onReceive method, or make a
Log.i("BroadcastSMSReceiver", "Received something in SMSRECEIVERTEST")
:)Edit, set priority to a high number instead of 1, just read that high number equals higher priority.
Code seems to me correct. You can try by increasing the priority by max ..
There may be case , when other receiver is getting sms before yours and aborting them.
Remove the
android:priority
attributeBased on android developer doc must be -1000>priority<1000 thus highest priority of intent-filter is 999