试图识别短信发送确认

Trying to ID the SMS delivery confirmation

我目前正在尝试获取每条已发送短信的确认信息。我需要确保我的短信已发送,所以我使用 BroadCastReceived 来获取信息:

Intent sentIntent = new Intent(SMS_SEND);
    sentIntent.putExtra("key", idSms);
    PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, PendingIntent.FLAG_UPDATE_CURRENT);

    SmsManager manager = SmsManager.getDefault();
    try{
        manager.sendTextMessage(exp, null, sms, sentPI, null);
        put("sending " + sms); //Just a method to print in a textview use has a console
    } catch (IllegalArgumentException e){
        put("Exception " + e.getMessage());
    }

并像这样使用广播接收器

public void onReceive(Context context, Intent intent){
        String idsms = intent.getExtras().getString("key");

        switch (getResultCode()) {
            case Activity.RESULT_OK:
                put("ACK : #" + idsms);

                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
            case SmsManager.RESULT_ERROR_RADIO_OFF:
            case SmsManager.RESULT_ERROR_NULL_PDU:
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                put("BOOM " + getResultCode() + "\n\tfrom sms #" + idsms);
                break;
        }
    }

在我尝试同时发送多条消息之前,这项工作就像一个魅力,额外的接收总是来自最后发送的短信,所以我无法识别发送了哪些文本,哪些没有发送。

这里有一个简单的例子说明会发生什么。

当我循环发送3条短信时:

id : 1, message : SMS 1
id : 2, message : SMS 2
id : 3, message : SMS 3

收到的会得到:

ACK : #3
ACK : #3
ACK : #3

我知道这来自 PendingIntent.FLAG_UPDATE_CURRENT 但我找不到解决方案。任何人都可以向我解释我应该如何使用 PendingIntent.getBroadcast(..) 来管理这个或者至少让我走上正轨。

你的问题是由于 PendingIntents 可以被系统重用,如果请求的某些事情没有不同的话。在您的代码中,您正在传递 FLAG_UPDATE_CURRENT,这导致每次请求 PendingIntent 时都会更新存储的 Intent 及其附加内容。这就是为什么您会收到每条消息的 id : 3。要更正此问题,您可以每次使用唯一的请求代码(第二个参数)调用 getBroadcast(),这将为每个请求创建一个新的 PendingIntent,每个请求都有一个单独的 Intent自己的演员。

对于您的情况,修复应该很简单,假设 idSms 对于每条消息都是唯一的。

PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(),
                                                  Integer.parseInt(idSms),
                                                  sentIntent,
                                                  PendingIntent.FLAG_UPDATE_CURRENT);