Envoyer des messages texte par programmation sur android
OK. Je suis l'envoi de messages texte par le biais de mon application. Après l'envoi d'un message texte, il envoie une mise à jour de l'État à un serveur. Cette partie fonctionne bien, mais le problème que je rencontre est double. Je ne suis pas sûr si elles sont liées, mais je suppose qu'ils sont.
Mon application a la capacité d'envoyer un texte unique pour plusieurs utilisateurs. Voici un exemple de code...
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)
{
}
}
}
en gros, il fait simplement une boucle à travers un tableau de numéros de téléphone, et envoie le texte un à la fois. Ici est l'endroit où une partie de mon problème se trouve. Si je choisis 3 numéros ou plus pour envoyer le texte, parfois tous les textes ne sont pas envoyés. Il arrive très aléatoire.
je suppose que c'est parce qu'il y a un délai entre l'envoi de chaque message individuel, mais le code n'attend pas assez longtemps. J'ai atteint cette hypothèse parce que si j'entre dans le programme en utilisant eclipse et passer manuellement à travers l'application, tout fonctionne toujours très bien.
Mon autre problème est quand j'envoie mise à jour de l'état du message texte sur un serveur web.
immédiatement après l'envoi des messages texte, l'application se connecte à internet et indique au serveur via un message http le nombre de textes qui ont été envoyés. Voici mon morceau de code 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();
cette section compile simplement les éléments pour le post, se connecte à une page web, et envoie le post. La clé ici est le délai de connexion de 10 Secondes. Encore une fois, comme je l'ai dit plus tôt, la connexion internet se produit immédiatement après l'envoi de textes. Donc, si je passe en mode Débogage et passe manuellement à travers le processus, tout fonctionne très bien. Mais si je lance l'application sur mon téléphone, j'obtiendrai une erreur de temps de connexion.
maintenant, j'espère que si je peux réduire le nombre de messages texte à un seul texte, quel que soit le nombre de destinataires, ce serait génial. J'ai essayé de séparer les numéros de téléphone avec une virgule, et qui n'a pas fonctionné. J'ai aussi essayé de séparer les nombres avec un point-virgule (exactement comme Microsoft Outlook, ou GMail vous permet d'ajouter plusieurs destinataires à un e-mail). Aucun de ceux qui ont travaillé pour moi. Quelqu'un aurait-il des suggestions? Même s'il existe une approche totalement différente, cela serait apprécié. Oh, Et je ne veux pas utiliser la messagerie Google intention d'envoyer les messages, je dois utiliser ma propre application.
4 réponses
vous devez en fait envoyer le prochain sms après l'envoi du précédent, pour cela vous devez vérifier l'état du sms envoyé, s'il vous plaît voir ce tutoriel, il dit:
si vous avez besoin de surveiller l'état du processus D'envoi de SMS, vous pouvez en fait utiliser deux objets PendingIntent ensemble avec deux objets BroadcastReceiver, comme ceci:
//---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);
}
je suppose que c'est ce dont vous avez besoin. L'extrait ci-dessous fournit pour entrer le message long et les diviser en partie et envoyer chacun d'eux à un contact donné ou même pour un groupe de contacts
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<String> parts = smsManager.divideMessage(message);
smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null);
}
vous devez D'abord ajouter la permission dans AndroidManifest.fichier xml
<uses-permission android:name="android.permission.SEND_SMS"></uses-permission>
alors écrivez ce code
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();
}
Vous pouvez essayer ce
SmsManager.getDefault().sendTextMessage(phoneNUmber, null, messageToSend, null, null);
Merci