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 2089 fois
Public
Internaute
Auteur de la publication
Fobec
Admin
Auteur de 261 articles
|BIO_PSEUDO|
Commentaires récents

Publié par deefaze dans CMS

R := Byte(Color);
G := Byte(Color shr 8);
B := Byte(Color shr 16);

Publié par Fobec dans tuto

Les liens vers les feuilles de style sont definis dans le template. L'emplacement sur le FTP depend du CMS utilise, par exemple sous WordPress les fichiers sont dans le dossier '/wpcontent/themes'

Publié par IANDRY dans tuto

c'est bien d'avoir les images et liste des pays du monde avec leurs drapeaux
respectif

Publié par Daxentuut dans java

Avec les imports c'est mieux :

import java.awt.AWTException
import java.awt.Robot
import java.awt.event.KeyEvent
import java.io.IOException
import java.util.logging.Level
import...

Publié par fobec dans CMS

fff - f,f,fklmf @@ f,kflf,k ??? !!! fff f f insert