Android短信群发 发送报告问题

现在把所有的号码都保存到了AllNumbersList列表里,现在发送的话,只能是每条信息都接受状态。
举例说明
现在的效果是:
每发一条信息(比如A,B,C),A的发送和回执状态Toast显示一次,然后B的再显示,然后再C的……依此类推。。。
而需要的效果:
所有信息发送成功后(如果发送的时候能显示进度最好,我想的是使用progressBar,不知道还有没有更好的办法?),显示为短信全部发送完毕,或者哪条没有发送成功把单条列出来。接受回执报告也是如此。
不知道各位有没有什么解决的办法,小弟在这里先谢过了!

private OnClickListener sendonlistener = new OnClickListener()
{
    public void onClick(View v)
    {
        String SENT_SMS_ACTION = "SENT_SMS_ACTION";
        String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";

        // 发送状态
        Intent sentIntent = new Intent(SENT_SMS_ACTION);
        PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, 0);
        // 接受状态
        Intent deliveryIntent = new Intent(DELIVERED_SMS_ACTION);
        PendingIntent deliverPI = PendingIntent.getBroadcast(getApplicationContext(), 0, deliveryIntent, 0);

        myDialog = ProgressDialog.show(MainActivity.this, "短信发送中", "请稍等...", true, true);

        SmsManager smsManager = SmsManager.getDefault();
        // 短信不能为空
        if (etable.length() == 0)
        {
            Toast.makeText(MainActivity.this, "短信内容不能为空!", Toast.LENGTH_LONG).show();
            myDialog.dismiss();
        } else
        // 超过70字分条发送
        if (etable.toString().length() > 70)
        {
            ArrayList<String> msgs = smsManager.divideMessage(etable.toString());
            for (String message : msgs)
            {
                for (int i = 0; i < AllNumbersList.size(); i++)
                {
                    smsManager.sendTextMessage(AllNumbersList.get(i), null, message, sentPI, deliverPI);
                }
            }
        } else
        {
            for (int i = 0; i < AllNumbersList.size(); i++)
            {
                // Log.d("选择的号码", manyNums.get(i));
                smsManager.sendTextMessage(AllNumbersList.get(i), null, etable.toString(), sentPI, deliverPI);
            }
        }

        // Register the Broadcast Receivers
        registerReceiver(new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                switch (getResultCode())
                {
                case Activity.RESULT_OK:
                    myDialog.dismiss();
                    Toast.makeText(MainActivity.this, "信息发送成功", Toast.LENGTH_SHORT).show();
                    break;
                case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                    myDialog.dismiss();
                    Toast.makeText(MainActivity.this, "信息发送失败,", Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_RADIO_OFF:
                    myDialog.dismiss();
                    Toast.makeText(MainActivity.this, "短信发送失败,请检查手机网络服务", Toast.LENGTH_LONG).show();
                    break;
                case SmsManager.RESULT_ERROR_NULL_PDU:
                    myDialog.dismiss();
                    Toast.makeText(MainActivity.this, "信息发送失败", Toast.LENGTH_LONG).show();
                    break;
                }
            }
        }, new IntentFilter(SENT_SMS_ACTION));

        registerReceiver(new BroadcastReceiver()
        {
            @Override
            public void onReceive(Context context, Intent intent)
            {
                Toast.makeText(MainActivity.this, "短信已成功发送到短信平台,谢谢您的使用", Toast.LENGTH_LONG).show();
            }
        }, new IntentFilter(DELIVERED_SMS_ACTION));
    }
};

该回答引用ChatGPT

您需要实现一种更加高效和用户友好的方式来发送短信并获得发送状态报告。为了达到这个目标,您可以使用SmsManager的sendMultipartTextMessage()方法一次发送所有短信,并使用BroadcastReceiver监听所有短信的发送状态。在接收到所有短信的发送状态后,您可以更新ProgressBar并显示短信的发送状态报告。


以下是一个示例代码:

private OnClickListener sendonlistener = new OnClickListener() {
    public void onClick(View v) {
        // 短信不能为空
        if (etable.length() == 0) {
            Toast.makeText(MainActivity.this, "短信内容不能为空!", Toast.LENGTH_LONG).show();
            return;
        }

        String SENT_SMS_ACTION = "SENT_SMS_ACTION";
        String DELIVERED_SMS_ACTION = "DELIVERED_SMS_ACTION";

        // 发送状态
        Intent sentIntent = new Intent(SENT_SMS_ACTION);
        PendingIntent sentPI = PendingIntent.getBroadcast(getApplicationContext(), 0, sentIntent, 0);
        // 接受状态
        Intent deliveryIntent = new Intent(DELIVERED_SMS_ACTION);
        PendingIntent deliverPI = PendingIntent.getBroadcast(getApplicationContext(), 0, deliveryIntent, 0);

        SmsManager smsManager = SmsManager.getDefault();
        ArrayList < String > msgs = smsManager.divideMessage(etable.toString());
        int numOfMsgs = msgs.size();
        int numOfRecipients = AllNumbersList.size();

        // 计算要发送的短信总数
        int numOfSmsToSend = numOfMsgs * numOfRecipients;

        // 发送状态报告列表
        ArrayList < Integer > sentStatusList = new ArrayList < Integer > (Collections.nCopies(numOfSmsToSend, -1));
        ArrayList < Integer > deliveredStatusList = new ArrayList < Integer > (Collections.nCopies(numOfSmsToSend, -1));

        myDialog = ProgressDialog.show(MainActivity.this, "短信发送中", "请稍等...", true, true);

        // 发送所有短信
        for (int i = 0; i < numOfMsgs; i++) {
            ArrayList < PendingIntent > sentPIList = new ArrayList < PendingIntent > ();
            ArrayList < PendingIntent > deliverPIList = new ArrayList < PendingIntent > ();
            for (int j = 0; j < numOfRecipients; j++) {
                sentPIList.add(sentPI);
                deliverPIList.add(deliverPI);
            }
            smsManager.sendMultipartTextMessage(AllNumbersList.toArray(new String[AllNumbersList.size()]), null, msgs.get(i), sentPIList, deliverPIList);
        }

        // Register the Broadcast Receivers
        BroadcastReceiver sentBroadcastReceiver = new BroadcastReceiver() {@Override public void onReceive(Context context, Intent intent) {
                int sentIndex = intent.getIntExtra("sentIndex", -1);
                int resultCode = getResultCode();
                sentStatusList.set(sentIndex, resultCode);
                updateProgressDialog(sentStatusList, deliveredStatusList);
            }
        };
        registerReceiver(sentBroadcastReceiver, new IntentFilter(SENT_SMS_ACTION));

        BroadcastReceiver deliveredBroadcastReceiver = new BroadcastReceiver() {@Override public void onReceive(Context context, Intent intent) {
                int deliveredIndex = intent.getIntExtra("deliveredIndex", -1);
                int resultCode = getResultCode();
                deliveredStatusList.set(deliveredIndex, resultCode);
                updateProgressDialog(sentStatusList, deliveredStatusList);
            }
        };
        registerReceiver(deliveredBroadcastReceiver, new IntentFilter(DELIVERED_SMS_ACTION));
    }
};