Ce tutoriel va aborder les broadCast Receiver sous Android. Nous allons commencer par expliquer le principe des broadcast receiver, puis nous allons faire un petit exemple d’un broadcast receiver qui reçoit les messages du téléphone.

Qu’est ce qu’un BroadCast Receiver ?

Pour pouvoir recevoir des intents, Android vous permet de créer une classe qui implémente BroadcastReceiver. Ces objets sont conçus pour recevoir des intents (intentions) et appliquer  des comportements spécifiques à votre code.

L’interface BroadcastReceiver ne possède qu’une seule méthode onReceive() que votre classe devra implémenter.

Un BroadcastReceiver ne vit que le temps de traiter votre onReceive(). L’instance peut être supprimée par le Garbage Collector.

Les receivers sont limités : ils ne peuvent pas ouvrir de boite de dialogue par exemple. Le système Android envoie l’intention à tous les BroadCast Receiver abonnées par ordre de priorité (priorité de votre BroadCast dans le fichier AndroidManifest.xml).

Si un BroadCast souhaite interrompre la réception du Broadcast à ceux d’un niveau inferieure de priorité, il faut utiliser la méthode abortBroadcast().

Mon premier BroadCast Receiver

On va créer un nouveau projet qu’on nommera “MyBroadCastReceiver”, avec les informations suivantes :

  • Version du SDK : 2.1
  • Application Name : My First Broadcast
  • Package Name : com.tuto.android
  • Min SDK version : 7
  • Décocher la cache : Create Activity

Nous allons créer une classe “SMSReceiver”,  qui hérite de “BroadcastReceiver”. Il vous demandera de rajouter les méthodes à implementer (OnReceive dans notre cas).

Votre classe doit ressembler à ça :

package com.tuto.android;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class SMSReceiver extends BroadcastReceiver
{

 @Override
 public void onReceive(Context arg0, Intent arg1)
 {
 // TODO Auto-generated method stub

 }

}

Donc pour recevoir les messages vous devez définir la permission ainsi que le Broadcast Receiver dans votre AndroidManifest.xml

  • Lecture et réception des sms
<uses-permission android:name="android.permission.RECEIVE_SMS" />
	<uses-permission android:name="android.permission.READ_SMS" />
  • Déclaration du Broadcast Receiver
<receiver class="com.tuto.android.SMSReceiver"
			android:name="com.tuto.android.SMSReceiver">
			<intent-filter android:priority="100">
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>

Donc on déclare notre receiver, on peut lui définir une priorité dans la récéption d’évènement (100 dans notre exemple) et dans la partie intent filtres, on définie que notre receiver est appelé quand le téléphone reçoit un SMS.

Donc voilà ce que devrait donner votre AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
	package="com.tuto.android" android:versionCode="1" android:versionName="1.0">
	<uses-sdk android:minSdkVersion="7" />

	<application android:icon="@drawable/icon" android:label="@string/app_name">
		<receiver class="com.tuto.android.SMSReceiver"
			android:name="com.tuto.android.SMSReceiver">
			<intent-filter android:priority="100">
				<action android:name="android.provider.Telephony.SMS_RECEIVED" />
			</intent-filter>
		</receiver>
	</application>

	<uses-permission android:name="android.permission.RECEIVE_SMS" />
	<uses-permission android:name="android.permission.READ_SMS" />
</manifest>

Revenons à notre classe, nous allons gérer la réception de notre évènement, donc dans la méthode OnReceive.

private final String				ACTION_RECEIVE_SMS					= "android.provider.Telephony.SMS_RECEIVED";

 @Override
 public void onReceive(Context context, Intent intent)
 {
 if (intent.getAction().equals(ACTION_RECEIVE_SMS))
 {
}
}

On déclare une chaîne de caractères qui représente l’action correspondante à l’évènement que l’on va recevoir et on teste si l’évènement reçu correspond bien à celui là.

Maintenant mettons en place la lecture du dernier message reçu et son affichage sous forme de toast.

package com.tuto.android;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;
import android.widget.Toast;

public class SMSReceiver extends BroadcastReceiver
{
 private final String	ACTION_RECEIVE_SMS	= "android.provider.Telephony.SMS_RECEIVED";

 @Override
 public void onReceive(Context context, Intent intent)
 {
 if (intent.getAction().equals(ACTION_RECEIVE_SMS))
 {
 Bundle bundle = intent.getExtras();
 if (bundle != null)
 {
 Object[] pdus = (Object[]) bundle.get("pdus");

 final SmsMessage[] messages = new SmsMessage[pdus.length];
 for (int i = 0; i < pdus.length; i++)  {  messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);  }  if (messages.length > -1)
 {
 final String messageBody = messages[0].getMessageBody();
 final String phoneNumber = messages[0].getDisplayOriginatingAddress();

 Toast.makeText(context, "Expediteur : " + phoneNumber, Toast.LENGTH_LONG).show();
 Toast.makeText(context, "Message : " + messageBody, Toast.LENGTH_LONG).show();

 }
 }
 }

 }

}

  • On récupère le message grâce aux extras de l’intent.
  • Puis on récupère dans le bundle , l’extra correspondant à  l’indentifiant “pdus
  • On récupère et on parcourt tous les messages pour obtenir le dernier.
  • Puis on récupère les infos souhaitées dans le dernier message.

Maintenant il suffit de lancer le projet dans votre émulateur préféré et puis à l’aide du contrôle de l’émulateur vous pouvez simuler l’envoi d’un message. Vous devriez obtenir le résultat suivant :

Conclusion

En espérant que ce tutoriel vous aura aidé à mieux comprendre comment fonctionne les broadcast receiver sous android.

Categories: Tutoriels

40 Responses so far.


  1. Alain dit :

    Bonjour, on dirait bien qu’en 4.0, l’application n’est pas lancé, l’icon de lancement n’apparait même pas sur l’émulateur !?!

  2. hicham dit :

    Bonjour,
    Merci pour le tutoriel et le code source .
    L’application avec le Broadcast receiver fonctionne sur un emulateur Android 2.3 par contre si je créé un émulateur sur Android 4.0
    Quelqu’un pourrait m’aider?
    Merci

  3. jebik dit :

    Bonjour merci pour le tutoriel

    Peut on savoir si le téléphone est sur une application de sms ou non? Afin de ne pas notifier quand on est dans nos sms? Existe t’il un reciver pour savoir que je dernier sms recu vient d’être lu? Si oui merci de m’aiguiller évidemment.

    • Android Guide dit :

      Bonjour,
      Pour savoir si le message est deja lu, par ton appli, tu peut mettre un tag de lecture sur tes messages du genre un boolean static ou utiliser les sharedpreferences pour memoriser les etats même après lancement.

Leave a Reply


Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.