如何识别哪些短信已在Android中获得发送报告

时间:2013-07-01 13:59:04

标签: android sms android-pendingintent

我的应用程序通过根据记录的大小合并记录,从sqlite数据库和SMS检索记录到其他应用程序,我无法识别哪些消息已经获得了交付报告,哪些消息没有。我在reciveMethods上使用BroadcastReceiver 但不幸的是我无法理解如何识别。我很乐意,如果你们中的任何一个人建议我如何处理这个问题。或任何其他更好的方式

    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 个答案:

答案 0 :(得分:4)

您需要将所需的数据放入PendingIntent,以便在传送完成(或失败)时广播。执行此操作时,您需要确保为每条消息创建唯一的PendingIntent(您可以通过在Intent上设置唯一的操作来执行此操作)。这是一个例子。

而不是:

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

这样做:

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

注册接收器时,请务必使用正确的IntentFilter

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

现在,当广播投放Intent时,您可以像onReceive()这样从中获取数据:

    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
        }