Intégrer les API Facebook sur Android (2/2)

Bonjour à tous et bienvenue dans la fin de ce tutoriel sur l’API Facebook pour Android. Dans le précédent article, nous avions fait la configuration du projet et du compte développeur et qui s’était achevé avec l’implémentation de la connexion via Facebook et de l’affichage du nom d’utilisateur.

Dans cet article, nous allons voir comment récupérer l’adresse mail et l’image de profil d’un utilisateur.

Récupération de l’image de profil

L’image de profil fait partie des informations publiques d’un profil Facebook, il n’y a donc pas de permission supplémentaire à demander. Cependant, celle-ci n’est pas disponible directement dans l’objet Profile qui fournit uniquement l’URL de l’image à l’aide de la fonction getProfilePictureUri(int width, int height) (qui prend en paramètres la taille voulue pour l’image).

Il faut donc télécharger l’image. Pour cela, je vous propose de créer une nouvelle classe qui hérite AsyncTask afin de télécharger l’image. Une solution serait de créer une interface OnImageDownloadedListener et l’implémenter dans l’activité principale, mais le plus simple dans notre cas est de passer notre ImageView à la construction de la tâche et d’afficher l’image si le téléchargement a réussi (rappelons que la méthode onPostExecute de AsyncTask s’exécute dans le thread UI).

Voici un exemple d’implémentation pour la classe FetchProfilePictureTask :

Vous pouvez également ajouter une véritable gestion des exceptions MalformedURLException et IOException (pour prévenir l’utilisateur d’une absence de connexion internet par exemple), mais cela n’est pas important pour notre exemple.

Il n’est pas nécessaire d’actualiser l’image si le résultat est null. En effet, cela aurait pour effet de supprimer l’image lors d’un échec de téléchargement. Préférez effacer manuellement le contenu de votre ImageView lorsque l’utilisateur est déconnecté.

À présent, il nous faut modifier displayProfileData pour qu’elle appelle la tâche de téléchargement de l’image :

Vous pouvez maintenant relancer l’application, l’image de profil devrait s’afficher correctement :

Affichage de la photo de profil.

Récupération de l’adresse mail de l’utilisateur

La dernière étape de ce tutoriel consiste en l’affichage de l’adresse email de l’utilisateur. Si l’utilisateur a fourni les permissions nécessaires, il est possible d’y accéder.

La récupération de l’adresse mail fait intervenir une API fondamentale du SDK Android de Facebook : la Graph API. Celle-ci permet la lecture et l’écriture sur le graphe du réseau social (pour récupérer l’adresse mail ou pour poster à la place de l’utilisateur si celui-ci l’a autorisé par exemple).

Obtention de l’AccessToken

Lorsque l’authentification Facebook est réussie, il est possible de récupérer un jeton d’accès qui sera utilisé lors des requêtes de la Graph API. Ce jeton permet à Facebook d’identifier l’application qui tente d’accéder au graphe et de s’assurer que l’utilisateur correspondant lui a bien donné les autorisations correspondantes. Le jeton dispose d’une durée de vie limitée, la méthode isExpired permet de déterminer s’il est encore valide ou non.

Dans la méthode onSuccess de la callback du bouton de login, le paramètre loginResult possède une fonction getAccessToken() permettant de récupérer le jeton. La méthode statique AccessToken.getCurrentAccessToken() est également disponible.
De la même façon que pour le Profile, nous allons utiliser un AccessTokenTracker que nous allons initialiser dans la méthode onCreate. Celui-ci se chargera d’appeler la méthode displayGraphAPIResult(AccessToken) qui sera créée par la suite :

Ici, un premier appel à displayGraphAPIResult est effectué puisque contrairement au ProfileTracker, le tracker du jeton n’est pas appelé au démarrage de l’activité (si l’utilisateur est déjà connecté).

À nouveau, assurez vous que le tracking soit arrêté à la fermeture de l’activité, lancez l’affichage dans la méthode onResume et mettez à jour la méthode onSuccess de la callback pour appeler la méthode displayGraphAPIResult :

La GraphRequest

Il reste maintenant à implémenter la fonction displayGraphAPIResult. Celle-ci prend donc en paramètre un AccessToken :

L’adresse mail de l’utilisateur sera affichée dans la TextView qui avait été déclarée précédemment dans le xml. Celle-ci doit être final puisqu’elle sera utilisée dans une callback de la GraphRequest (la closure ne peut être faite que sur des attributs finaux en Java).

Il est bien entendu nécessaire de vérifier que le jeton n’est pas null, puisque la méthode est susceptible d’être appelée alors qu’aucun AccessToken n’est disponible. Cela permet également de détecter une déconnexion et donc de vider le contenu de la view. De plus, si le jeton est expiré, il n’y a pas de raison d’effectuer la requête qui va de toute façon échouer.

La GraphRequest est créée à l’aide de la méthode statique GraphRequest.newMeRequest. Celle-ci prend en argument un AccessToken (valide) et une GraphRequest.GraphJSONObjectCallback possédant la méthode onCompleted qu’il nous faudra surcharger :

La réponse est composée d’un objet JSON, contenant les valeurs demandées en cas de succès et d’une GraphResponse définissant le statut de la réponse.

Ici, il n’est pas obligatoire de s’intéresser à la GraphResponse puisque la nullité du JSONObject retourné est testée et que l’obtention de la valeur de l’email est englobé dans un bloc try-catch. En pratique, pour des requêtes plus complexes, la GraphResponse contient des informations utile pour gérer les cas d’erreur avec notamment les méthodes getError, getConnexion et getRequest.

Le champ contenant l’email se nomme simplement email. Si le champ est présent et non-nul, alors sa valeur est affichée dans la vue correspondante.

Une fois la GraphRequest créée, il faut l’exécuter. Pour ce faire, nous devons lui préciser les informations qui nous intéressent. Cela se fait à l’aide d’un Bundle :

Puisque nous demandons des valeurs spécifiques, le premier paramètre est fields, la chaîne suivante contient tous les paramètres demandés séparés par des virgules (par exemple “email, id” si nous souhaitions également l’id). À nouveau, la documentation précise le nom de champ correspondant à chaque donnée du graphe. Voici un exemple de JSON retourné par une GraphRequest demandant les informations basiques sur un utilisateur :

Le code pour la requête de l’email de l’utilisateur est maintenant terminé et prêt à être testé :

MainActivity.java

[collapse]

Affichage de l’adresse e-mail.

Publication de l’application

La partie implémentation est désormais terminée. Cependant, l’application est toujours phase de développement et il faut encore configurer le mode Release pour que n’importe quel utilisateur puisse se connecter avec votre application.

Pour cela, il est nécessaire de fournir un second Key Hash, appelé “Release Key Hash” (clef de production). La manipulation est la même que pour la génération du Development Key Hash à la différence que la clef à fournir est celle avec laquelle vous allez signer votre application. Utilisez donc le keystore de release correspondant à votre application.

Une fois encore, il est possible d’utiliser la fonction getFacebookKey qui avait été présentée pour la génération du Development Key Hash. Je rappelle qu’il ne faut pas laisser l’affichage d’une clef en production et cela est d’autant plus vrai pour la clef de production.

Ajoutez ensuite le hash généré à la liste de Key Hashes sur votre console développeur de Facebook.

À présent, vous pouvez publier l’application comme vous l’auriez fait pour n’importe-quelle application Android. La console développeur Facebook pourra cependant vous donner des informations complémentaires à Google Play concernant l’utilisation de votre application.

Aller plus loin

Maintenant que avec eu un aperçu du fonctionnement du SDK Facebook Android, vous pouvez poursuivre en essayant d’intégrer des fonctionnalités plus avancées. Voici quelques liens qui pourront vous être utiles :

Si vous êtes intéressé par le fait de proposer un lien de partage prédéfini pour facebook, vous pouvez choisir de créer un bouton de partage sans passer par le Android SDK à l’aide des Social Plugins.

Références et ressources

%d bloggers like this: