Android O offre une API pour gérer nativement les codes reçus par SMS
Depuis Android 5.0 (Lollipop), Google propose aux développeurs plusieurs versions preview avant d'officialiser une nouvelle version stable de son système d'exploitation. La dernière version date d'il y a seulement quelques jours, sous le nom de code Android O. Elle est téléchargeable sur les Nexus et Pixels et les développeurs peuvent déjà jouer avec le nouveau jeu d'API mis à disposition.
Google fournit une liste non exhaustive des nouveautés en se focalisant sur les composants majeurs recevants des modifications. C'est ainsi qu'en fouillant dans la documentation du SMS Manager, j'ai pu observer l'ajout d'une méthode qui devrait grandement faciliter la vie des développeurs :
String createAppSpecificSmsToken (PendingIntent intent)
Create a single use app specific incoming SMS request for the the calling package. This method returns a token that if included in a subsequent incoming SMS message will cause intent to be sent with the SMS data. The token is only good for one use, after an SMS has been received containing the token all subsequent SMS messages with the token will be routed as normal. An app can only have one request at a time, if the app already has a request pending it will be replaced with a new request.
Cette méthode permet ni plus ni moins que de gérer les codes reçus par SMS. Mais avant de s'intéresser d'avantage à cette nouveauté, regardons comment cela fonctionne aujourd'hui.
Avant Android O
Sur les versions antérieures à Android O, deux solutions sont possibles pour gérer un code reçu par SMS.
La première consiste à envoyer ledit SMS et à laisser l'utilisateur copier / coller le contenu au bon endroit. Cela ne demande aucun travail côté application, mais laisse l'utilisateur quitter l'application.
La seconde méthode consiste cette fois à proposer à l'utilisateur une solution intégrée. Pour cela, il faut aller lire les SMS et trouver le message correspondant. Cela présente toutefois plusieurs inconvénients :
- Demander la permission READ_SMS (dynamique depuis Marshmallow)
- Devoir chercher à la main dans les SMS
- L'utilisateur peut ne pas avoir confiance, car l'application peut alors lire l'intégralité des SMS
Par ailleurs ces deux solutions ont l'inconvénient de laisser le code visible publiquement dans la liste des SMS. N'importe quelle autre application peut donc venir lire l'information.
A partir d'Android O
Ces deux méthodes ont donc des inconvénients. C'est pour cela que Google a travaillé sur une API dédiée à cette fonctionnalité. Désormais lorsqu'une application devra recevoir un code, elle fera appel à cette méthode. Elle retourne un token (sous la forme d'une String) unique, qu'il faudra envoyer vers le serveur. Le serveur de SMS devra inclure ce token dans le message afin qu'il soit rerouté vers notre application.
La lecture du contenu du message ne nécessite plus la permission READ_SMS et arrivera directement dans un Intent qui sera déchiffrable via la méthode getMessagesFromIntent du SMSManager.
L'autre point positif de la méthode est que le SMS ne sera plus affiché dans l'historique des messages. L'utilisateur ne verra certes plus une longue liste de SMS sans intérêt, mais surtout aucune autre application ne pourra en lire le contenu. Une avancé à la fois sur ergonomique et pour la sécurité des données des utilisateurs.
Cet article a également été publié dans une version simplifiée sur FrAndroid.