Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Broadcast Receiver with sendMultiPartTextMessage

Tags:

android

I've been trying to get the status result code from sendMultipartTextMessage, the thing i don't understand is if the broadcast receiver works with sendTextMessage, why doesnt it work with sendMultipartTextMessage? I've searched far and wide and looked and code examples but just cant see any obvious reasons as to why this wont work. Can anyone shed any light on this?

ArrayList<String> messages = sms.divideMessage(text);
int messageCount = messages.size();
ArrayList<PendingIntent> deliveryIntents = new ArrayList<PendingIntent>(messageCount);
ArrayList<PendingIntent> sentIntents = new ArrayList<PendingIntent>(messageCount);

for (int j = 0; j < messageCount; j++) {
    sentIntents.add(
            PendingIntent.getBroadcast(context, 0, new Intent(SENT_ACTION),
            0));
}
sms.sendMultipartTextMessage(phoneNumber, null, messages, sentIntents, null);

Here's my BroadcastReceiver:

private BroadcastReceiver messageSentReceiver = new BroadcastReceiver() {      
    @Override
    public void onReceive(Context context, Intent intent) {
        switch (getResultCode()) {
           case Activity.RESULT_OK:
               Toast.makeText(context, "SMS sent", Toast.LENGTH_SHORT).show();
               break;
           case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
              Toast.makeText(context, "Generic failure", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_NO_SERVICE:
              Toast.makeText(context, "No service", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_NULL_PDU:
              Toast.makeText(context, "Null PDU", Toast.LENGTH_SHORT).show();
              break;
          case SmsManager.RESULT_ERROR_RADIO_OFF:
              Toast.makeText(context, "Radio off", Toast.LENGTH_SHORT).show();
              break;
          }
      }
 };

The code is done as below:

sentIntents = new ArrayList<PendingIntent>();
sentIntent = PendingIntent.getBroadcast(context, 0, new Intent(SENT_ACTION), 0);
deliveredIntent = PendingIntent.getBroadcast(context, 0, new Intent(DELIVERED_ACTION), 0);

context.registerReceiver(messageSentReceiver, new IntentFilter(SENT_ACTION));
context.registerReceiver(messageDeliveredReceiver, new IntentFilter(DELIVERED_ACTION));

If anyone could shed any light on this, i would really appreciate it. I just can't see why this could work with sendTextMessage but not on sendMultipartTextMessage.

Thanks.

like image 940
huza Avatar asked Jan 23 '11 13:01

huza


1 Answers

Hi you are missing to mention brodcast receiver name in your intent.

Please try below code it's working fine for me..

    ArrayList<PendingIntent> sentPendingIntents = new ArrayList<PendingIntent>();
    ArrayList<PendingIntent> deliveredPendingIntents = new ArrayList<PendingIntent>();
    PendingIntent sentPI = PendingIntent.getBroadcast(mContext, 0,
            new Intent(mContext, SmsSentReceiver.class), 0);

    PendingIntent deliveredPI = PendingIntent.getBroadcast(mContext, 0,
            new Intent(mContext, SmsDeliveredReceiver.class), 0);
    try {
        SmsManager sms = SmsManager.getDefault();
        ArrayList<String> mSMSMessage = sms.divideMessage(message);
        for (int i = 0; i < mSMSMessage.size(); i++) {
            sentPendingIntents.add(i, sentPI);

            deliveredPendingIntents.add(i, deliveredPI);
        }
        sms.sendMultipartTextMessage(phoneNumber, null, mSMSMessage,
                sentPendingIntents, deliveredPendingIntents);

    } catch (Exception e) {

        e.printStackTrace();
        Toast.makeText(mContext, "SMS sending failed...",
                Toast.LENGTH_SHORT).show();
    }

Create a boardcast receiver for sent sms like below.

public class SmsSentReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    switch (getResultCode()) {
    case Activity.RESULT_OK:
        Toast.makeText(context,
                "SMS Sent" + intent.getIntExtra("object", 0),
                Toast.LENGTH_SHORT).show();

        break;
    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
        Toast.makeText(context, "SMS generic failure", Toast.LENGTH_SHORT)
                .show();

        break;
    case SmsManager.RESULT_ERROR_NO_SERVICE:
        Toast.makeText(context, "SMS no service", Toast.LENGTH_SHORT)
                .show();

        break;
    case SmsManager.RESULT_ERROR_NULL_PDU:
        Toast.makeText(context, "SMS null PDU", Toast.LENGTH_SHORT).show();
        break;
    case SmsManager.RESULT_ERROR_RADIO_OFF:
        Toast.makeText(context, "SMS radio off", Toast.LENGTH_SHORT).show();
        break;
    }
}

Create another broadcast receiver for sms deliver as below.

public class SmsDeliveredReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent arg1) {
    switch (getResultCode()) {
    case Activity.RESULT_OK:
        Toast.makeText(context, "SMS delivered", Toast.LENGTH_SHORT).show();
        break;
    case Activity.RESULT_CANCELED:
        Toast.makeText(context, "SMS not delivered", Toast.LENGTH_SHORT).show();
        break;
    }
}

}

And finally declare receiver in manifest.

<receiver android:name=".receiver.SmsSentReceiver" >
    </receiver>
    <receiver android:name=".receiver.SmsDeliveredReceiver" >
    </receiver>
like image 68
sandy Avatar answered Oct 26 '22 23:10

sandy