Publié le 02/03/2015
Auteur Fobec
Réseaux sociaux
0 partages
0 tweets
3 plus
0 commentaires

Envoyer des texto avec SmsManager

Echanger des SMS (Short Message Service) est une fonction de base sur tous les appareils mobiles. Sur les téléphones portables Android, la programmation d'envoi d'un texto tient en 2 lignes de code. L'exemple ci-dessous se sert de 2 évènements liés avec BroadcastReceiver à l'opération pour savoir si le destinataire a bien recu le SMS.

Interface graphique pour la rédaction de SMS

1162-send-sms

Pour envoyer des texto avec Android, l'interface graphique se compose des composants suivants:
zone de saisie du numéro de téléphone du destinataire,
zone de saisie du contenu du message,
bouton pour lancer l'envoi,
barre de status permettant de connaitre l'étape en cours.


Le layout de l'application est le suivant:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:id="@+id/linearLayout1"
              android:layout_width="fill_parent"
              android:layout_height="fill_parent"
              android:orientation="vertical" > 
    <TextView
        android:id="@+id/tvPhoneNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Saisir le numero de portable : "
        android:textAppearance="?android:attr/textAppearanceLarge" /> 
    <EditText
        android:id="@+id/etPhoneNumber"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:phoneNumber="true" >
    </EditText> 
    <TextView
        android:id="@+id/tvMsg"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Composer le message"
        android:textAppearance="?android:attr/textAppearanceLarge" /> 
    <EditText
        android:id="@+id/edMsg"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:inputType="textMultiLine"
        android:lines="5"
        android:gravity="top" /> 
    <Button
        android:id="@+id/btSend"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Envoyer" />
    <TextView
        android:id="@+id/tvStatus"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Status: redaction du message"
        android:padding="10dip"
        android:background="#C0C0C0"
        android:textColor="#000000"/>
</LinearLayout>
Pour cette application, les droits à ajouter au manifest sont l'envoi de SMS, à savoir
<uses-permission android:name= "android.permission.SEND_SMS" />

Envoyer un texto avec confirmation de reception

Comme dit, l'envoi d'un SMS avec Android ne pose pas trop de souci, il suffit d'appeler le service SmsManager puis de fournir le numéro de téléphone et le texte à envoyer. Afin de savoir si le texto a bien été recu par le destinataire, 2 listener peuvent etre définis sur la communication entre l'expéditeur, le fournisseur d'accès et le destinataire:
sendingBroadcastReceiver(): ce listener retourne le résultat entre l'appareil mobile et le fournisseur d'accès,
deliveryBroadcastReceiver(): le listener indique si le destinateur a eu le texto. Attention, certains opérateurs de téléphonie ne communiquent pas la valeur de retour.

import android.app.Activity;
import android.app.PendingIntent;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.telephony.SmsManager;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
 
/**
 * Envoyer un texto avec Android
 * http://www.fobec.com/java/1162/envoyer-sms.html
 * @author Fobec 02/03/2015
 */
public class MainActivity extends Activity {
    //Layout
    private EditText textPhoneNo;
    private EditText textSMS;
    private TextView status;
    //constante
    final private String SENT = "SMS_SENT";
    final private String DELIVERED = "SMS_DELIVERED";    
 
    /**
     * Ensemble de fonction pour envoyer un texto
     * @param phoneNumber
     * @param message 
     */
    public void sendSms(String phoneNumber, String message) {
        status.setText("Status: preparation de l'envoi");
 
        PendingIntent piSent = PendingIntent.getBroadcast(this, 0, new Intent(SENT), PendingIntent.FLAG_CANCEL_CURRENT);
        PendingIntent piDelivered = PendingIntent.getBroadcast(this, 0, new Intent(DELIVERED), PendingIntent.FLAG_CANCEL_CURRENT);
 
        //Communication entre l'appareil mobile et le fournisseur d'accès
        //répond à la question : est ce que le texto a été envoyé
        BroadcastReceiver sendingBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String result = "";
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        result = "Transmission successful";
                        break;
                    case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                        result = "Transmission failed";
                        break;
                    case SmsManager.RESULT_ERROR_NO_SERVICE:
                        result = "Radio off";
                        break;
                    case SmsManager.RESULT_ERROR_NULL_PDU:
                        result = "No PDU defined";
                        break;
                    case SmsManager.RESULT_ERROR_RADIO_OFF:
                        result = "No service";
                        break;
                }
                Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
                //Retirer l'enregistrement de l'evenement
                getBaseContext().unregisterReceiver(this);
                status.setText("Status: confirmation d'envoi "+result);
            }
        };
        this.registerReceiver(sendingBroadcastReceiver,new IntentFilter(SENT));
 
        //Communication entre l'opérateur de téléphonie et le destinataire
        //Est-ce que le destinataire a eu le SMS
        BroadcastReceiver deliveryBroadcastReceiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String result = "";
                switch (getResultCode()) {
                    case Activity.RESULT_OK:
                        result = "SMS delivery";
                        break;
                    case Activity.RESULT_CANCELED:
                        result = "Delivery failed";
                        break;
                }
                Toast.makeText(getApplicationContext(), result, Toast.LENGTH_SHORT).show();
                //Retirer l'enregistrement de l'evenement
                getBaseContext().unregisterReceiver(this);
                status.setText("Status: confirmation de reception "+result);
            }
        };
        this.registerReceiver(deliveryBroadcastReceiver,new IntentFilter(DELIVERED));
 
        //Envoi du SMS avec les API Android
        SmsManager smsManager = SmsManager.getDefault();
        smsManager.sendTextMessage(phoneNumber, null, message, piSent, piDelivered);
        status.setText("Status: SMS envoyé");
    }
 
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        //Récupérer les composants du layout
        Button buttonSend = (Button) findViewById(R.id.btSend);
        textPhoneNo = (EditText) findViewById(R.id.etPhoneNumber);
        textSMS = (EditText) findViewById(R.id.edMsg);
        status = (TextView) findViewById(R.id.tvStatus);
 
        //Envoyer le SMS au click sur le bouton
        buttonSend.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                String phoneNo = textPhoneNo.getText().toString();
                String sms = textSMS.getText().toString();
                sendSms(phoneNo, sms);
            }
        });
    }
}

Pour tester le code source et l'application Android, je me suis envoyé des SMS, rien à signaler ça marche bien. Par contre, les evenements construits à partir de BroadcastReceiver() sont asynchrones. Lors de nos tests, la confirmation de reception du texto par le destinataire est parfois assez long à obtenir.
L'envoi des texto à partir d'une application Android s'est bien passé, prochain défi envoyer des MMS !

Ajouter un commentaire

Les champs marqués d'un * sont obligatoires, les adresses emails se sont pas publiées.

A lire aussi

Réseaux sociaux
Présentation de l'article
Catégorie
java - android
Mise a jour
02/03/2015
Visualisation
vu 1884 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par neuro dans CMS

exemple edifaint et trés interessant

Publié par jpa71 dans java

Efficace.. Bien commente.. Du code bien pense
Bravo

Publié par etoiliste010 dans java

BONSOIR le code compile mais
Grave: null
com.sun.mail.smtp.SMTPSendFailedException: 530 5.7.0 Must issue a STARTTLS command first. gd4sm1845967wib.6

at com.sun.mail.smtp.SMTPTransport.i...

Publié par inf0mag dans news

Et avec les objets connectes, a va encore exploser !

Publié par jadu dans tuto

Et comment met-on en route Xinha lorsque l'extension a été chargée dans Firefox ?????

je n'ai rien trouvé !!!