I am developing an application in which I need to send 100+ messages. After going through several threads, I found out that the restriction on sending messages, such as 100 messages, can be sent in an hour. To do this, I divide my list of recipients into pieces and put a delay of 5 seconds between each port and a delay of 3 seconds in each message. The delay between pieces increases after each piece, and when it reaches 100 seconds, it will reset to 5 seconds. After that, it worked fine for 50 messages, but when I raise the list of recipients, it causes problems, some messages do not fall into the first place and are displayed as error messages in native.
Is there any standard way to achieve this, I may need to send more than 100 messages, how can I send several messages without any glitches at once. If I need to set a delay, then what should be the appropriate delay between pieces or messages.
Thanks in advance.
private final int MAX_SMS_IN_ONE_TIME = 10; private final int DELAY_BETWEEN_CHUNKS = 5000; public void sendMessage(arguments){ // Send long messages in chunk of 20 messages and put gap of increasing 5 seconds till 50 seconds and then reset. final Iterator iterator = messageChunks.iterator(); new Thread(new Runnable() { @Override public void run(){ int interval =1; while (iterator.hasNext()) { for (final Contact contact : (List<Contact>) iterator.next()) { sendSMS(body, contact.getmMobileNumbers().get(0)); App.trackEvent("Message", "Sent", "Messages from our sms app"); } } try { Log.i("chunk", "chunk # " + interval + " delay is " + DELAY_BETWEEN_CHUNKS); Thread.sleep(DELAY_BETWEEN_CHUNKS * interval); interval++; if (interval == 10) { interval = 1; } } catch (InterruptedException e) { e.printStackTrace(); } } } }).start(); } public void sendSMS(final String message, final String phoneNo) { try { String SENT = "com.ebryx.smscustommessagegeneration"+""+System.currentTimeMillis()+""+((int)this.getmMessageId()); Intent intentMessageASendStatus = new Intent(SENT); final PendingIntent pi = PendingIntent.getBroadcast(App.getContext(), ((int)this.getmMessageId()), intentMessageASendStatus, PendingIntent.FLAG_CANCEL_CURRENT); final ArrayList<PendingIntent> sentPI = new ArrayList<PendingIntent>(){{add(pi);}}; App.getContext().registerReceiver(new BroadcastReceiver(){ @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Log.i("tag","sent successfully "); break; case SmsManager.RESULT_ERROR_GENERIC_FAILURE: Log.i("tag","Generic Failure"); break; case SmsManager.RESULT_ERROR_NO_SERVICE: Log.i("tag","No service failure"); break; case SmsManager.RESULT_ERROR_NULL_PDU: break; case SmsManager.RESULT_ERROR_RADIO_OFF: Log.i("tag","Airplane mode failure"); break; } } }, new IntentFilter(SENT)); final SmsManager smsManager = SmsManager.getDefault(); final ArrayList<String> parts = smsManager.divideMessage(message); new Timer().schedule(new TimerTask() { @Override public void run() { smsManager.sendMultipartTextMessage(phoneNo, null, parts, sentPI, null); }}, 3000); } } catch (Exception e) { e.printStackTrace(); } }
source share