Recevoir des SMS sous Android
Pour les tests en développement, il sera possible de simuler l'envoi d'un SMS vers votre émulateur.
Reception d'un SMS
En fait, il s'agit de définir votre application comme pouvant recevoir des SMS.
Tout d'abord poser une permission dans le fichier AndroidManifest.xml (Cf. permission):
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
Puis déclarer un broadcast receiver sur les SMS via le filtre d'intention:
android.provider.Telephony.SMS_RECEIVED
Par exemple
Il reste enfin à définir la classe MonSMSReceiver qui va étendre BroadcastReceiver !
Mais avant, il nous voir comment fonctionne la réception d'un SMS dans le broadcaster receiver.
Assez classiquement, une méthode onReceiver sera déclenchée. En paramètre, le contexte et une instance d'intention qui va contenir les informations du SMS à traiter.
Cette information est stockée dans un Bundle.
Cette instance de Bundle est lui même stockée tout naturellement dans la zone extra de l'intention. D'où un début de code:
Du déjà vu, facile jusque là !
Reste à traiter l'information se trouvant dans le Bundle. Celle-ci est composée du/des SMS, un SMS étant stocké sous forme de PDUs (Protocol Data Units).
Pour récupérer le/les PDUs, il suffit d'utiliser la clef "pdus" sur le Bundle.
Celui-ci va retourner un tableau d'Object. Ces instances qu'il faudra convertir en SmsMessage pour pouvoir les traiter. La conversion se fera à l'aide la méthode SmsMessage.createFromPdu():
Voilà des instances de SmsMessage tous beaux, tous propres...
Mais comment les traiter maintenant ?
Ces instances vont pouvoir nous retourner:
Le numéro de l'émetteur du SMS: getOriginatingAddress()
La date et l'heure de l'envoi (sous forme de Times stamp): getTimestampMillis()
Et évidemment le corps du message: getMessageBody()
Exemple de code
Voici un exemple complet de code...
Pour aller plus loin
En fait, il existe déjà de nombreuses applications pour gérer bien mieux que nous des SMS. Alors pourquoi réinventer la roue ?
Par contre, là où cela peut devenir intéressant, c'est que vous allez pouvoir filtrer ces SMS.
Rien de plus simple, puisqu'il s'agit d'un "vulgaire" broadcast Receiver !
Vous priorisez votre Broadcast Receiver pour être certain d'être le premier à les traiter, puis vous traitez les informations du SMS que vous recevez.
Le filtre pourra se faire par exemple sur le n° de l'émetteur, ou pourquoi pas sur un code au début du SMS qui indique que ce SMS est particulier, que c'est donc à vous de le prende en charge.
Reste alors à annuler le broadcast pour que les autres applications pouvant éventuellement traiter ce SMS ne le fassent pas à leur tour !
Voici un exemple:
Comme indiqué dans le code, on peut aussi imaginer un filtre sur un
code positionné au début du message, si le code est présent,
alors une action pourrait suivre derrière...
Par exemple déclencher une sirène
d'alarme, faire un effacement de la carte SD, ... Tiens, cela me rappel
vaguement quelques similitudes dans ce que propose par exemple Avast
avec ses commandes SMS !
Bref laisser aller votre imagination !
Autre possibilité
Voici un exemple pour ne traiter la réception de SMS que lorsque votre application est active. L'intérêt: je ne sais pas encore...
Dans ce cas, il n'y a pas de filtre à déclarer dans le fichier AndroidManifest.xml (sinon, ce qui suit ne servirai à rien !)
La classe brocastReceiver MonSMSReceiver ne change pas, mais il faudra déclarer celui-ci dans votre application via registerReceiver:
Ne pas oublier
de déclarer ce programme pour que cela marche dans le fichier AndroidManifest.xml
!
Par exemple:
Les points importants:
- Déclaration d'un filtre d'intention.
- Déclaration d'une instance sur le broadcast receiver
- Enregistrement dynamique du broadcast receiver
- Désenregistrement du broadcast receiver si fin du programme
Annexes
Cf. l'envoi de SMS
Et peut être l'utilisation du root sous Android ???
Espionner le
téléphone portable d'un tiers est une atteinte à la vie
privée. Le code pénal prévoit que l'enregistrement des
paroles sans le consentement, tout comme la violation du secret de la correspondance,
sont punis d'une peine d'un an de prison et d'une amende de 45 000 euros.