Android:向多个收件人发送短信并获得确认

时间:2014-12-18 06:49:12

标签: android sms confirmation smsmanager

我想发送给多个接收者。 我还想使用内置的SMS机制,而不是提示所需的应用程序(Whatsapp等)

为了完成这个,我使用的是Android的SmsManager。

for循环遍历移动号码的mobileList数组,并逐个发送短信给每一个。

BroadcastReceiver为deliverActionIntent意图检索传送SMS的指示。

我正在用“Delivered”这个词和正在传递的邮件的索引号一起弹出一个祝酒词。

我的问题是:

  1. 未显示实际索引(idx)。我为所有人提供相同的索引号,即mobileList项的数量。 为什么会这样?我期望每个移动设备的索引。

  2. mobileList项目的数量是否有限?例如,我可以有200个人吗?

  3. 我在4个手机号码的列表上对此进行了测试,但随后我获得了8-10个祝酒词。我期待一次移动递送的吐司。 这有什么问题?

  4. 如何在发送所有短信时收到通知?我想这应该是像AsyncTask这样的后台操作。 有人可以告诉我该怎么做吗?

  5. SmsManager的代码如下所示。

    SmsManager smsManager = SmsManager.getDefault();
    
    for(idx = 0; idx < mobileList.length; idx++) {
    
        String toNumber = mobileList[idx];
        String sms = message;
    
        // SMS sent pending intent
        Intent sentActionIntent = new Intent(SENT_ACTION);
        sentActionIntent.putExtra(EXTRA_IDX, idx);
        sentActionIntent.putExtra(EXTRA_TONUMBER, toNumber);
        sentActionIntent.putExtra(EXTRA_SMS, sms);
        PendingIntent sentPendingIntent = PendingIntent.getBroadcast(this, 0, sentActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
        /* Register for SMS send action */
        registerReceiver(new BroadcastReceiver() {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                String result = "";
    
                switch (getResultCode()) {
    
                case Activity.RESULT_OK:
                    result = "Transmission successful";
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    result = "Transmission failed";
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    result = "Radio off";
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    result = "No PDU defined";
                    break;
                case SmsManager.RESULT_ERROR_NO_SERVICE:
                    result = "No service";
                    break;
                }
    
                // Toast.makeText(getApplicationContext(), result,  Toast.LENGTH_SHORT).show();
            }
    
        }, new IntentFilter(SENT_ACTION));                  
    
    
        // SMS delivered pending intent
        Intent deliveredActionIntent = new Intent(DELIVERED_ACTION);
        deliveredActionIntent.putExtra(EXTRA_IDX, idx);
        deliveredActionIntent.putExtra(EXTRA_TONUMBER, toNumber);
        deliveredActionIntent.putExtra(EXTRA_SMS, sms);
        PendingIntent deliveredPendingIntent = PendingIntent.getBroadcast(this, 0, deliveredActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    
        /* Register for Delivery event */
        registerReceiver(new BroadcastReceiver() {
    
            @Override
            public void onReceive(Context context, Intent intent) {
                Toast.makeText(getApplicationContext(), "Deliverd " + Integer.toString(idx), Toast.LENGTH_SHORT).show();
            }
    
        }, new IntentFilter(DELIVERED_ACTION));
    
        //send
        smsManager.sendTextMessage(toNumber, null, sms, sentPendingIntent, deliveredPendingIntent);
    }
    

1 个答案:

答案 0 :(得分:1)

1)运行for循环时,idx会发生变化。因此,每次敬酒时,您都会显示idx的当前值,即显示的消息数。由于您已将其打包在意图中,因此您只需在onReceive方法中显示文字"Delivered" + intent.getIntExtra(EXTRA_IDX, -1)即可。

2)我不确定你在问什么。

3)我不确定副手,目前无法调试。

4)您必须跟踪您收到的指数。 HashSet<Integer>可以做到这一点。

在你的for循环之上,添加:

final HashSet<Integer> undelivered = new HashSet<Integer>();

在你的for循环中,添加:

undelivered.add(idx);

要一次性回答1,3和4的问题,请将onReceived正文更改为:

// Get the index from the intent
int idx = intent.getIntExtra(EXTRA_IDX, -1);

if (undelivered.contains(idx)) {
    // This index is now delivered. We remove it from the undelivered set, and Toast that it was delivered.
    undelivered.remove(idx);
    Toast.makeText(getApplicationContext(), "Delivered " + idx, Toast.LENGTH_SHORT).show();

    if (undelivered.isEmpty() {
        // We've delivered all of the messages ...
        Toast.makeText(getApplicationContext(), "All messages were delivered.", Toast.LENGTH_SHORT).show();
    }
}