web-dev-qa-db-fra.com

Envoi de messages texte par programmation dans android

D'ACCORD. J'envoie des SMS via 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 sais pas s'ils sont liés, mais je suppose qu'ils le sont.

Mon application a la possibilité d'envoyer un seul texte à plusieurs utilisateurs. Voici un exemple du 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)
        {

        }
    }
}

Fondamentalement, il parcourt simplement un tableau de numéros de téléphone et envoie le texte un à la fois. Voici où réside une partie de mon problème. Si je choisis 3 numéros ou plus vers lesquels envoyer le texte, parfois tous les textes ne sont pas réellement envoyés. Cela se produit de façon 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 que je passe manuellement par l'application, tout fonctionne toujours très bien.

Mon autre problème est lorsque j'envoie la mise à jour de l'état du message texte à un serveur Web.

Immédiatement après l'envoi des SMS, l'application se connecte ensuite à Internet et indique au serveur via un message http le nombre de SMS envoyés. Voici mon extrait 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 de la publication, se connecte à une page Web et envoie la publication. 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 a lieu immédiatement après l'envoi des SMS. Donc, si je passe en mode débogage et que j'exécute manuellement le processus, tout fonctionne bien. Mais si je lance simplement l'application sur mon téléphone, j'obtiendrai une erreur de délai 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 par une virgule, et cela n'a pas fonctionné. J'ai également essayé de séparer les chiffres par un point-virgule (exactement comme Microsoft Outlook ou GMail vous permet d'ajouter plusieurs destinataires à un e-mail). Aucun de ceux-là ne travaillait pour moi. Est-ce que quelqu'un a des suggestions? Même s'il existe une approche totalement différente, cela serait apprécié. Oh, et je ne veux pas utiliser l'intention de messagerie Google pour envoyer les messages, je dois utiliser ma propre application.

40
Lucas Bailey

Vous devez en fait envoyer les sms suivants après l'envoi du précédent, pour cela, vous devez vérifier l'état des sms envoyés, veuillez voir ce tutoriel , il dit:

Si vous devez surveiller l'état du processus d'envoi de message SMS, vous pouvez réellement utiliser deux objets PendingIntent 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);        
    }
71
Yaqub Ahmad

Je suppose que c'est ce dont vous avez besoin. L'extrait ci-dessous permet d'entrer un long message et de les diviser en partie et d'envoyer chacun d'eux à un contact donné ou même à 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);
}
18
Abhijeet Sonawane

Vous devez d'abord ajouter une autorisation dans le fichier AndroidManifest.xml

<uses-permission Android:name="Android.permission.SEND_SMS"></uses-permission>

puis écris 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();
            }
2
Antony jackson