Interface graphique pour la rédaction de 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>
<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 !