如何找出哪些短信未送达或发送?

How to find out which sms has not been delivered or sent?

我有以下代码,我想知道哪些短信已发送或未发送。 我的代码每 30 秒发送 1-5 条短信,所以当 toast "sms not delivered" 出现时,我不知道哪一条没有发送。我不知道这样做是否正确,但这是解决此问题的最常见方法

public boolean sendSMS(String id, String num, String msg) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
            SENT), 0);

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);

    registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT));

    registerReceiver(deliveryBroadcastReciever, new 
 IntentFilter(DELIVERED));
    SmsManager smsManager = SmsManager.getDefault();
    smsManager.sendTextMessage("xxxxxxxx", null, msg, sentPI, deliveredPI);

    Log.e("Message Sent", num + "  " + msg + "  " + id);

    return true;
}


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


        switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "sms delivered",
                        Toast.LENGTH_SHORT).show();
                break;
            case Activity.RESULT_CANCELED:
                Toast.makeText(getBaseContext(), "sms not delivered",
                        Toast.LENGTH_SHORT).show();
                break;
        }

    }
}

class SentReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent arg1) {
        switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(getBaseContext(), "sms sent", Toast.LENGTH_SHORT)
                        .show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(getBaseContext(), "Generic failure",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(getBaseContext(), "No service",
                        Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(getBaseContext(), "Null PDU", 
      Toast.LENGTH_SHORT)
                        .show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(getBaseContext(), "Radio off",
                        Toast.LENGTH_SHORT).show();
                break;
        }

    }

对不起我的英语不好。

编辑:

 public boolean sendSMS(String id, String num, String msg) {
    String SENT = "SMS_SENT";
    String DELIVERED = "SMS_DELIVERED";

    PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(
            SENT), 0);

    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
            new Intent(DELIVERED), 0);

    registerReceiver(sendBroadcastReceiver, new IntentFilter(SENT));

    registerReceiver(deliveryBroadcastReciever, new IntentFilter(DELIVERED));

    smsManager.sendTextMessage("+xxxxxxxxxx", null, msg, sentPI, deliveredPI);

    Log.e("Message Sent", num + "  " + msg + "  " + id);

    return true;
}


public class DeliverReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        final Bundle bundle = intent.getExtras();

        try {

            if (bundle != null){
                final Object[] bObject = (Object[]) bundle.get("pdus");

                for (int i = 0; i < bObject.length; i++){

                    SmsMessage current = SmsMessage.createFromPdu((byte[]) bObject[i]);
                    String phoneNum = current.getDisplayOriginatingAddress();
                }
            }
        }catch (Exception e){
            Log.e("Deliver Reciever",e.toString());
        }
    }
}

调试截图:http://imgur.com/a/GulgP

首先,将您的 SmSManager 设为静态 class 对象。然后,您可以从隐藏在意图对象中的 PDU 中获取当前 phone number/phone 数字。

final SmsManager sms = SmsManager.getDefault();

public void onReceive(Context context, Intent intent) {
    final Bundle bundle = intent.getExtras();
    String phone = "";
    SmsMessage smsMessage;

    try {

        if (bundle != null) {

            final Object[] pdu = (Object[]) bundle.get("pdu");

            for (int i = 0; i < pdu.length; i++) {

                 smsMessage = SmsMessage.createFromPdu((byte[]) pdu[i]);
                 phone = current.getDisplayOriginatingAddress();
            }
        }
    }
}