广播接收器与sendMultiPartTextMessage

时间:2011-01-23 13:16:21

标签: android

我一直在尝试从sendMultipartTextMessage获取状态结果代码,我不明白的是广播接收器是否与sendTextMessage一起使用,为什么它不能与sendMultipartTextMessage一起使用?我搜索了很多,看起来和代码示例,但只是看不出任何明显的原因,为什么这不会工作。任何人都可以对此有所了解吗?

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);

这是我的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;
          }
      }
 };

代码完成如下:

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));

如果有人能说清楚这一点,我会非常感激。我无法理解为什么这可以与sendTextMessage一起使用,但不能在sendMultipartTextMessage上使用。

感谢。

2 个答案:

答案 0 :(得分:5)

嗨,你很想在你的意图中提到brodcast接收者名字。

请尝试下面的代码,它对我来说很好..

    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();
    }

为发送的短信创建一个Boardcast接收器,如下所示。

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;
    }
}

为sms创建另一个广播接收器,如下所示。

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;
    }
}

}

最后在清单中声明接收器。

<receiver android:name=".receiver.SmsSentReceiver" >
    </receiver>
    <receiver android:name=".receiver.SmsDeliveredReceiver" >
    </receiver>

答案 1 :(得分:0)

尝试将IntentFilter设置为(SENT)而不是(SENT_ACTION)。它对我来说很好。