How to identify which SMS has got Delivery report

2020-06-22 03:31发布

问题:

My application retrieves records from sqlite database and SMS to other application by merging the records based on the size of the record, i am intruble to identify which messages have got the delivery report and which does'not . i am using BroadcastReceiver on reciveMethods but unfortunately i can't understand how to identify . i would love if any one of you suggest me the how to handle this problem. or any other better way

    public class MessageMangerActivity extends Activity {

    private String MessageBody;
    public  enum  MessageType
    {
           s,r,c
    }
    String ReceiverNumber="5556";
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        //setContentView(R.layout.messages);
         try {
            SubmitReportToServer();
        } catch (Exception e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
    private void SubmitReportToServer() throws Exception {
       // MessageHandler messageHandler =new MessageHandler();
        //get Unsent Message
        ReportAdapter reportAdapter= new ReportAdapter(this);
        reportAdapter.open();

        /* Submit Received Item report*/
        Cursor  receivingResults;
        receivingResults=reportAdapter.FetchUnSentReceivingRecords();
        int i=0;
        if(receivingResults.getCount()!=-1) {
            while(receivingResults.moveToNext() ){
              MessageBody=MessageType.r + MessageBody +"|"+ receivingResults.getString(0)+"|" + receivingResults.getString(1)+"|"+receivingResults.getString(2)+"|"+
                      receivingResults.getString(3)+"|"+receivingResults.getString(4)+"|"+receivingResults.getString(5)+"|"+receivingResults.getString(6)+"|"+
                      receivingResults.getString(7)+"|" + receivingResults.getString(8)+"|"+ receivingResults.getString(9)+"|"+
                      receivingResults.getString(10)+"|"+receivingResults.getString(11)+",";
                i++;
                if (i > 1 )  { break;  }
            }
             sendSMS(ReceiverNumber,MessageBody);
            receivingResults.close();
        /* Submit Issued Item report*/
            Cursor  issueResults;
            issueResults=reportAdapter.FetchUnSentIssuedRecords();
            i=0;
            if(issueResults.getCount()!=-1) {
                while(issueResults.moveToNext() ){
                    MessageBody=MessageBody + ","+ issueResults.getExtras();
                    i++;
                    if (i > 3 )  { break;  }
                }
                sendSMS(ReceiverNumber,MessageBody);
                issueResults.close();
          }
        }
        /*Submit Vaccinated Children Report   */
            Cursor  childrenResults;
            childrenResults=reportAdapter.FetchUnSentVaccinatedChildrenRecords();
             i=0;
            if(childrenResults.getCount()!=-1) {
                while(childrenResults.moveToNext() ){
                    MessageBody=MessageBody + ","+ childrenResults.toString();
                    i++;
                    if (i > 3 )  { break;  }
                }
                sendSMS(ReceiverNumber,MessageBody);
                childrenResults.close();
    }
    }

    private void sendSMS(String receiverNumber, String messageBody) {
        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(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, Intent arg1) {
                switch (getResultCode())
                {
                    case Activity.RESULT_OK:
                        Toast.makeText(getBaseContext(), "SMS sent",
                                //update Status
                                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;
                }
            }
        }, new IntentFilter(SENT));

//—when the SMS has been delivered—
        registerReceiver(new BroadcastReceiver(){
            @Override
            public void onReceive(Context arg0, 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;
                }
            }
        }, new IntentFilter(DELIVERED));

    ``    SmsManager sms = SmsManager.getDefault();
        sms.sendTextMessage(receiverNumber, null, messageBody, sentPI, deliveredPI);
    }
}

回答1:

You need to put the data you need into the PendingIntent that will be broadcast when the delivery completes (or fails). When doing this you need to make sure that you create a unique PendingIntent for each message (you can do this by setting a unique ACTION on the Intent). Here's an example.

Instead of this:

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

Do this:

    long messageID = ... // This is the message ID, ie: the row ID in the SQLite database that uniquely identifies this message
    Intent deliveredIntent = new Intent(DELIVERED + messageID); // Use unique action string
    deliveredIntent.putExtra("messageID", messageID); // Add message ID as extra
    PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
           deliveredIntent, PendingIntent.FLAG_ONE_SHOT);

When you register the receiver, be sure to use the correct IntentFilter:

    registerReceiver(new BroadcastReceiver(){
        ...
    }, new IntentFilter(DELIVERED + messageID));

Now, when the delivery Intent is broadcast, you can get the data from it in onReceive() like this:

    public void onReceive(Context arg0, Intent arg1) {
        long messageID = arg1.getLongExtra("messageID", -1L);
        if (messageID != -1L) {
            // This is the message ID (row ID) of the message that was delivered
            ... do your processing here
        }