Envío de mensajes de texto de forma programática en Android

DE ACUERDO. Estoy enviando mensajes de texto a través de mi aplicación. Después de enviar un mensaje de texto, envía una actualización de estado a un servidor. Esta parte funciona bien, pero el problema con el que me estoy cruzando es doble. No estoy seguro si están relacionados, pero supongo que sí.

Mi aplicación tiene la capacidad de enviar un solo texto a múltiples usuarios. Aquí hay una muestra del código …

if(phoneNumbers.length > 0 && message.getText().toString().equals("") == false) { for(int i=0;i<phoneNumbers.length;i++) { sms = SmsManager.getDefault(); try { sms.sendTextMessage(phoneNumbers[i], null, message.getText().toString(), null, null); sentQuantity++; } catch(IllegalArgumentException e) { } } } 

Básicamente, simplemente recorre una serie de números de teléfono y envía el texto uno a la vez. Aquí es donde se encuentra parte de mi problema. Si elijo 3 o más números para enviar el texto, a veces no se envían todos los textos. Sucede muy al azar.

Supongo que es porque hay un retraso entre el envío de cada mensaje individual, pero el código no espera lo suficiente. Llegué a esta suposición porque si entro al progtwig usando eclipse y paso por la aplicación manualmente, todo siempre funciona bien.

Mi otro problema es cuando envío la actualización del estado del mensaje de texto a un servidor web.

Inmediatamente después de que se envían los mensajes de texto, la aplicación se conecta a Internet y le dice al servidor a través de un mensaje http la cantidad de mensajes que se enviaron. Aquí está mi fragmento de código de Internet …

 for(int i = 0; i < postNames.length; i++) { nameValuePairs.add(new BasicNameValuePair(postNames[i], postValues[i])); } //http post try{ HttpParams httpParameters = new BasicHttpParams(); int timeoutConnection = 10000; HttpConnectionParams.setConnectionTimeout(httpParameters,timeoutConnection ); HttpClient httpclient = new DefaultHttpClient(httpParameters); HttpPost httppost = new HttpPost(webAddress); httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent(); 

Esta sección simplemente comstack los artículos para la publicación, se conecta a una página web y envía la publicación. La clave aquí es el tiempo de espera de conexión de 10 segundos. Una vez más, como dije antes, la conexión a Internet ocurre inmediatamente después de enviar los textos. Entonces, si entro en el modo de depuración y realizo un paso a través del proceso, todo funciona bien. Pero si solo ejecuto la aplicación en mi teléfono, obtendré un error de tiempo de espera de conexión.

Ahora, espero que si puedo reducir la cantidad de mensajes de texto a un solo texto, independientemente de la cantidad de destinatarios, eso sería increíble. Intenté separar los números de teléfono con una coma, y ​​eso no funcionó. También traté de separar los números con un punto y coma (exactamente como Microsoft Outlook, o GMail le deja agregar destinatarios múltiples a un correo electrónico). Ninguno de esos funcionó para mí. ¿Alguien tiene alguna sugerencia? Incluso si hay un enfoque diferente en conjunto, eso sería apreciado. Ah, y no quiero usar la intención de Google Messaging para enviar mensajes, necesito usar mi propia aplicación.

De hecho, necesita enviar el siguiente sms después de que se envíe el anterior, para esto debe verificar el estado del sms enviado, consulte este tutorial , que dice:

Si necesita supervisar el estado del proceso de envío de mensajes SMS, puede utilizar dos objetos PendingIntent junto con dos objetos BroadcastReceiver, como este :

  //---sends an SMS message to another device--- private void sendSMS(String phoneNumber, String message) { 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); //---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; } } }, 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(phoneNumber, null, message, sentPI, deliveredPI); } 

Supongo que esto es lo que necesitas. El siguiente fragmento permite ingresar un mensaje largo y dividirlo en parte y enviarlo individualmente a un contacto determinado o incluso a un grupo de contactos.

 public void sendLongSMS() { String phoneNumber = "0123456789"; String message = "Hello World! Now we are going to demonstrate " + "how to send a message with more than 160 characters from your Android application."; SmsManager smsManager = SmsManager.getDefault(); ArrayList parts = smsManager.divideMessage(message); smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null); } 

Primero debe agregar el permiso en el archivo AndroidManifest.xml

  

luego escribe este código

 try { String ph="1234568790"; String msg="Haiii friend"; SmsManager smsManager = SmsManager.getDefault(); smsManager.sendTextMessage(ph, null,msg, null, null); Toast.makeText(MainActivity.this, "Message Sent", Toast.LENGTH_LONG).show(); } catch (Exception e) { Toast.makeText(MainActivity.this, "Message not Sent", Toast.LENGTH_LONG).show(); } 

Puedes intentar esto

SmsManager.getDefault().sendTextMessage(phoneNUmber, null, messageToSend, null, null);

Gracias