Search code examples
androidbroadcastreceiverandroid-servicesmsmanager

How do I listen to SMS Delivered broadcast inside of a Service?


I'm trying to send an SMS from a background service and perform some action when it gets delivered.

Sending the SMS works. But the OnReceive method of my broadcast receiver is never called even when the SMS is delivered.

I have tested the broadcast receiver with other actions and it works.

For example adding the action "android.intent.action.SCREEN_OFF" works just fine.

It only fails to work with the custom action "SMS_DELIVERED" which I send in the PendingIntent.

Below is my code:

public class SendMessageService extends Service {

private static final String TAG = "SendMessageService";
public static final String SMS_DELIVERED = "SMS_DELIVERED";
private BroadcastReceiver deliveryBroadcastReceiver = null;

@Override
public void onCreate() {
    super.onCreate();

    IntentFilter intentFilter = new IntentFilter();

    intentFilter.addAction(SMS_DELIVERED);

    intentFilter.setPriority(100);

    deliveryBroadcastReceiver = new DeliverReceiver();

    registerReceiver(deliveryBroadcastReceiver, intentFilter);

    Log.d(TAG, "Service onCreate: deliveryBroadcastReceiver is registered.");
}

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    Bundle extras = intent.getExtras();

    String phoneNumber = extras.getString("PHONE_NUMBER");
    String msg = extras.getString("msg");

    sendSMS(phoneNumber, msg);

    Log.d(TAG, "onStartCommand: Sent SMS");

    return START_STICKY;
}

private void sendSMS (String phoneNumber, String msg){

    PendingIntent deliveredPI = PendingIntent.getBroadcast(getApplicationContext(), 0,
            new Intent(SMS_DELIVERED), 0);

    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage(phoneNumber, null, msg, null, deliveredPI);
}

public class DeliverReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent arg1) {

        Log.d(TAG, "onReceive: Delivered onReceive called");

        // Do something here
    }
}

@Override
public void onDestroy() {
    super.onDestroy();
    unregisterReceiver(deliveryBroadcastReceiver);
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}
}

Solution

  • The code above is actually fine. Seems like the problem was that my Telecom Carrier (EthioTel) did not provide reliable sms delivered reports.