【问题标题】:How to pass data of sent SMS message using PendingIntent to BroadcastReciever?如何将使用 PendingIntent 发送的 SMS 消息的数据传递给 BroadcastReceiver?
【发布时间】:2019-07-03 20:48:45
【问题描述】:

我想在发送大量短信时将一些数据传递给BroadcastReceiver,以指示发送/传递了哪条消息。

我尝试使用带有不同标志的标准 PendingIntent,但得到了错误的结果(BroadcastReceiver 总是获得第一个/最后一个意图的附加信息)。有谁知道在使用SmsManager 发送短信时如何将数据传递给BroadcastReceiver

发送短信的功能:

private void sendSMS(SmsRequest _smsRequest) {

        Intent sentInt = new Intent(SmsNotificationSending.SENT);
        sentInt.putExtra("SMS_ID", _smsRequest.getmId());

        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentInt, 0);

        Intent delivInt = new Intent(SmsNotificationSending.DELIVERED);
        delivInt.putExtra("SMS_ID", _smsRequest.getmId());

        PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, delivInt, 0);

        registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT));
        registerReceiver(deliveryBroadcastReceiver, new IntentFilter(DELIVERED));

        SmsManager
                .getSmsManagerForSubscriptionId(1)
                .sendTextMessage(_smsRequest.getmRecipientNumber(),
                        null,
                        _smsRequest.getmMessage(),
                        sentPI,
                        deliveredPI);
    }

我的BroadcastReceiver 班级:

public class DeliveryReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                Log.d("sms", "Broadcast received: " + intent.getAction());
                Log.d("sms" ,"Sms was delivered" + intent.getIntExtra("SMS_ID", -1));
                break;
            case Activity.RESULT_CANCELED:
                Log.d("sms" ,"Sms was not delivered");
                break;
        }

    }
}

sendSms() 一个接一个地调用了很多次,在日志中我收到了许多接收到的广播,但只有第一条SMS_ID 的 SMS 消息。 请帮帮我!

【问题讨论】:

  • 这似乎不可能。您使用不同的 ACTION 创建每个 PendingIntent,并且该 ACTION 是一些随机数(Long 值)。然后,您注册一个接收器,当 ACTION 是固定字符串 SENTDELIVERED(无论它们是什么)时应该调用该接收器。由于这些东西不匹配,因此您的 BroadcastReceiver 不应该被调用!
  • @DavidWasser 对不起,我不小心发布了我没有更改的代码,但谢谢。

标签: java android android-pendingintent smsmanager


【解决方案1】:

这段代码不符合你的要求:

    Intent sentInt = new Intent(SmsNotificationSending.SENT);
    sentInt.putExtra("SMS_ID", _smsRequest.getmId());
    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, sentInt, 0);

    Intent delivInt = new Intent(SmsNotificationSending.DELIVERED);
    delivInt.putExtra("SMS_ID", _smsRequest.getmId());
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0, delivInt, 0);

问题在于,这段代码每次都重复使用相同的PendingIntent(其中的第一个 SMS_ID 在 extras 中)。

您需要在每次执行此代码时创建一个新的PendingIntent。为此,您需要执行以下一项(或多项)操作:

  • 每次调用PendingIntent.getBroadcast()时使用不同的requestCode(第二个参数)
  • 每次在 Intent 中使用不同的 ACTION(您可以通过在使用 new Intent(...) 实例化 Intent 时在 ACTION 中包含 SMS_ID 来做到这一点

这将确保每次都创建唯一的PendingIntents,从而解决您的问题。

【讨论】:

  • 非常感谢,你比我快一点,我刚开始自己​​写答案,因为我在 2 个月前解决了这个问题:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多