S'abonner à Techno Geek

Techno Geek‎ > ‎

[Android][dev] lancer une action à la reception d'un SMS

publié le 6 mai 2011 09:39 par Florian GRISONI
Le but de cet article est de voir comment exécuter une action à la réception d'un SMS.
Pour cela nous allons développer un bout de code affichant un message POKE lorsque l'on reçoit un SMS dont le message commence par ##androPoke##. De cette façon nous verrons :
  • comment lancer notre application à la réception d'un SMS
  • récupérer le message d'un SMS
Les concepts de développement Android utilisé ici sont:

Les permissions: se sont les accès nécessaire à l'application pour effectuer certaines opérations, le but est que l'utilisateur en téléchargeant sont application visualise ce à quoi l'application peut avoir accès sur son téléphone. La liste des : http://developer.android.com/reference/android/Manifest.permission.html

Les intents : se sont des intentions,  ce mécanisme permet de notifier les applications que des opérations peuvent être effectuée.

Les bases des concepts de développement Android: http://developer.android.com/guide/topics/fundamentals.html

Réagir à la réception d'un SMS


Afin d'avoir le droit de "s'abonner" à la réception d'un SMS, il est nécessaire que l'application en possède les permissions nécessaire pour cela, rajouter dans le manifest de l'application la permission correspondante, android.permission.RECEIVE_SMS :

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

Maintenant que nous avons l'autorisation de la faire, voyons comment s'abonner à la réception d'un SMS.

Le mécanisme est le suivant: lorsque l'on reçoit un SMS un intent est levé android.intent.category.LAUNCHER, nous indiquons donc à notre application que nous somme capable de la traiter intent-filter, ce que nous faisons receiver et la priorité vis à vis des autres applications android:priority.

Ce qui donne dans notre manifest :




<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="fr.cyber06.AndroPoke"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".AndroPoke"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <receiver android:name=".PokeReceiver"
            android:enabled="true" android:priority="-1">
            <intent-filter android:priority="0">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>
    </application>

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

Ensuite, nous créons une classe capable d'être appelée lorsque l'on recevra un message. Celle correspondant à notre receiver,  ( avec un point devant le nom de la classe) : receiver android:name=".PokeReceiver"

Pour cela nous étendrons la classe BroadcastReceiver (capable de répondre à la balise receiver) qui assure la méthode: onReceive.

Notre intent est passé en paramètre, les paramètres de l'intentions sont récupéré via la méthode getExtras(). Dans les extras nous récupérons les informations sur le SMS ici le contenu du message.

Voici le code:


package fr.cyber06.AndroPoke;

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 PokeReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {

        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
            // récupérer SMS
            Bundle bundle = intent.getExtras();       
            SmsMessage[] msgs = null;
         
            if (bundle != null)
            {
                // récupérer le SMS
                Object[] pdus = (Object[]) bundle.get("pdus");
                msgs = new SmsMessage[pdus.length];    
                String body ="";
                for (int i=0; i<msgs.length; i++){
                    msgs[i] = SmsMessage.createFromPdu((byte[])pdus[i]);               
                    body =  msgs[i].getMessageBody().toString(); 
                    if(body.startsWith("##androPoke##")){
                                       // action a effectuer à la réception du SMS: ici affichage du mot POKE
                                       // lorsque le SMS commence par
##androPoke##
                        Toast.makeText(context, "POKE", Toast.LENGTH_SHORT).show();
                    }
                    Toast.makeText(context, body, Toast.LENGTH_SHORT).show();
                }
               
            }
                       
        }
    }

}





Comments