Note that there are some explanatory texts on larger screens.

plurals
  1. PODifferentiating delivery reports of two separate SMS's
    text
    copied!<p>In a service, when sending smses in a loop with a broadcast receiver listening for delivery reports, how to differentiate the delivery report of each sms sent? This is similar to : <a href="https://stackoverflow.com/questions/10975792/how-to-get-delivery-report-of-each-sms-sent-in-loop-android">How to get Delivery Report of each SMS sent in loop android?</a></p> <p>except that I think he's using it in an activity and I'm using it in a service where getIntent() is of no avail.</p> <p>Edit 2: posting my code</p> <pre><code>public class CheckServer extends Service { public String snumber[] = new String[10]; public JSONArray array; public int onStartCommand(Intent intent,int flags, int startid) { // Do useful things. ServiceAction SA = new ServiceAction(); SA.execute(); try { SA.get(); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } new startSending().execute(); scheduleNextUpdate(); return START_STICKY; } public class startSending extends AsyncTask&lt;Void,Void,Void&gt; { @Override protected Void doInBackground(Void... params) { String no,message; try { for (int i = 0; i &lt; array.length(); i++) { JSONObject row; row = array.getJSONObject(i); snumber[i] = row.getString("sno"); no = row.getString("no"); message = row.getString("message"); sendSMS(no,message,snumber[i]); } } catch (IllegalStateException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } } private void scheduleNextUpdate() { Intent intent = new Intent(this, this.getClass()); PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); // The update frequency should often be user configurable. This is not. long currentTimeMillis = System.currentTimeMillis(); long nextUpdateTimeMillis = currentTimeMillis + 1 * DateUtils.MINUTE_IN_MILLIS; Time nextUpdateTime = new Time(); nextUpdateTime.set(nextUpdateTimeMillis); AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.set(AlarmManager.RTC, nextUpdateTimeMillis, pendingIntent); } public class ServiceAction extends AsyncTask&lt;Void,Void,Void&gt; { @Override protected Void doInBackground(Void... arg0) { HttpResponse response = null; HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); try { request.setURI(new URI("http://www.somesite.com/sms/getsms")); response = client.execute(request); String result = convertStreamToString(response.getEntity().getContent()); array = new JSONArray(result); } catch (URISyntaxException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (JSONException e) { e.printStackTrace(); } return null; } } public static String convertStreamToString(InputStream inputStream) throws IOException { if (inputStream != null) { Writer writer = new StringWriter(); char[] buffer = new char[1024]; try { Reader reader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"),1024); int n; while ((n = reader.read(buffer)) != -1) { writer.write(buffer, 0, n); } } finally { inputStream.close(); } return writer.toString(); } else { return ""; } } public void sendSMS(String number,String message,String serialnum) { String SENT = "SMS_SENT"; PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0); //---when the SMS has been sent--- registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context arg0, Intent arg1) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS sent", 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; } unregisterReceiver(this); } }, new IntentFilter(SENT)); String DELIVERED = "SMS_DELIVERED"; Intent delivered = new Intent(DELIVERED); delivered.putExtra("MsgNum", serialnum); PendingIntent deliveredPI = PendingIntent.getBroadcast(this, Integer.parseInt(serialnum), delivered, 0); //---when the SMS has been delivered--- registerReceiver(new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { switch (getResultCode()) { case Activity.RESULT_OK: Toast.makeText(getBaseContext(), "SMS delivered",Toast.LENGTH_SHORT).show(); updateSMSStatus USS = new updateSMSStatus(); USS.execute(intent.getStringExtra("Msgnum")); break; case Activity.RESULT_CANCELED: Toast.makeText(getBaseContext(), "SMS not delivered",Toast.LENGTH_SHORT).show(); break; } unregisterReceiver(this); } }, new IntentFilter(DELIVERED)); ContentValues values = new ContentValues(); values.put("address", number); values.put("body", message); getContentResolver().insert(Uri.parse("content://sms/sent"), values); SmsManager smsMngr = SmsManager.getDefault(); smsMngr.sendTextMessage(number, null, message, sentPI, deliveredPI); } public class updateSMSStatus extends AsyncTask&lt;String,Void,Void&gt; { @Override protected Void doInBackground(String... params) { HttpResponse response = null; HttpClient client = new DefaultHttpClient(); HttpGet request = new HttpGet(); try { Log.i("SMS APP", "MyClass.getView() — Serial Number = " + params[0]); request.setURI(new URI("http://www.somesite.com/sms/updatesmsstatus?uname=someone&amp;sno="+params[0])); response = client.execute(request); String result = convertStreamToString(response.getEntity().getContent()); Log.i("SMS APP","Update SMS Status is :"+result); } catch (URISyntaxException e) { e.printStackTrace(); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return null; } } @Override public IBinder onBind(Intent intent) { return null; } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload