【问题标题】:How to identify which SMS has got Delivery report in Android如何在Android中识别哪些短信有送达报告
【发布时间】:2013-07-01 13:59:04
【问题描述】:

我的应用程序通过根据记录的大小合并记录来从 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);
    }
}

【问题讨论】:

    标签: android sms android-pendingintent


    【解决方案1】:

    您需要将您需要的数据放入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
            }
    

    【讨论】:

    • 谢谢戴夫,我按照你说的做了,但我看不到回调何时启动,我的另一个模拟器没有收到任何消息。我错过了什么我已经合并的东西
    • 对不起,我不知道这是否适用于模拟器。我只知道它适用于真实设备。
    • I recommend setting a unique requestAction 不是使用唯一的操作来识别意图的消息
    • 这个待处理的意图只会在您发送短信时被调用一次。由于 TextBasedColumns 中没有 MESSEGE_TYPE_DELIVERED,您如何确定何时回来?我需要手动处理吗?
    • @Dr.aNdRO 对不起,我不明白你的评论。请重试或打开一个新问题,您可以在其中详细说明您的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 1970-01-01
    相关资源
    最近更新 更多