Ludovic ROLAND

Blog technique sur mes expériences de développeur.

Android : Accéder à l'e-mail d'un utilisateur via le Facebook Connect

31 mai 2014

Dans le précédent article de ce blog, nous avons vu comment mettre en place le Facebook Connect dans une application Android. Par défaut, Facebook ne nous permet pas d’accéder à beaucoup d’informations concernant l’utilisateur comme par exemple son adresse e-mail.

Dans ce nouvel article nous allons donc voir comment accéder ajouter l’autorisation d’accéder à l’adresse e-mail d’un utilisateur lors de sa connexion dans notre application Android.

Le point de départ

Pour ce ticket, je ne vais pas partir de zéro et me baser sur le précédent article permettant de mettre en place le Facebook Connect dans une application Android.

Ainsi, pour tout ce qui est téléchargement du SDK Facebook, création de l’application Facebook, création de l’application Android, intégration du SDK Facebook, connexion basique et déconnexion basique, je vous demande de vous référer au projet du précédent ticket. En fait, du projet réalisé dans le ticket précédent, nous allons tout conserver pour ne retravailler que la méthode connectToFacebook().

La connexion à Facebook

Nous avions vu que lancer une connexion à Facebook est très simple puisqu’il convient d’appeler la méthode statique openActiveSession de la classe Facebook Session. Pour pouvoir accéder à l’adresse e-mail de l’utilisateur ça sera un peu différent. En effet, nous allons devoir ouvrir une session à l’aide d’un OpenRequest qui nous permet de personnaliser les permissions demandées à un utilisateur.

Nous allons donc commencer par créer une OpenRequest et lui spécifier les permissions dont nous avons besoin (dans notre cas l’e-mail de l’utilisateur) via la méthode setPermissions. Finalement, comme c’était le cas pour l’ouverture d’une session classique, nous allons également lui spécifier une callback dont la méthode call sera appelée à la fin de la connexion.

La méthode setPermissions prend pour paramètre une liste de chaînes de caractères représentant les différentes permissions. Dans le cadre de l’accès à l’adresse e-mail de l’utilisateur, il convient de demander la permission email.

A noter que suivant que votre code soit exécuté dans un Fragment ou une Activity, il convient de choisir le bon constructeur de l’objet OpenRequest.

final OpenRequest openRequest = new OpenRequest(getActivity()).setPermissions(Arrays.asList("email")).setCallback(new StatusCallback()
{

  @Override
  public void call(Session session, SessionState state, Exception exception)
  {
  }
});

Comme pour une connexion classique, dans la méthode call de la callback, il convient de vérifier que la connexion a effectivement réussi en vérifiant l’état de la session. Si celle-ci est ouverte c’est que la connexion a réussi. Dans le cas contraire, nous pouvons afficher le message d’erreur stockée dans l’exception :

final OpenRequest openRequest = new OpenRequest(getActivity()).setPermissions(Arrays.asList("email")).setCallback(new StatusCallback()
{

  @Override
  public void call(Session session, SessionState state, Exception exception)
  {
    if (session.isOpened() == true) {
		  //connexion réussie !
	  }
	  else {
		  if(exception != null) {
	      //On affiche le message d'erreur
	      Toast.makeText(getActivity(), exception.getMessage(), Toast.LENGTH_LONG).show();
      }
	  }
  }
});

Il convient maintenant d’afficher, lorsque la session est ouverte, l’adresse e-mail de l’utilisateur. Cette information de nous est pas donnée automatiquement et nécessite la mise en place d’une requête via la méthode newMeRequest de ma classe Facebook Request. Cette méthode prend deux paramètres :

  • la session Facebook ;
  • une callback.

Cette nouvelle callback sera appelée quand la requête sera terminée et nous renverra l’utilisateur à travers la classe Facebook GraphUser :

Request.newMeRequest(session, new GraphUserCallback() {
	@Override
	public void onCompleted(GraphUser user, Response response) {
	  if(user != null) {
      //on affiche l'e-mailde l'utilisateur
		  Toast.makeText(getActivity(), user.asMap().get("email").toString(), Toast.LENGTH_LONG).show();
	  }
	  else {
		  //on affiche un message d'erreur
		  Toast.makeText(getActivity(), "Impossible de récupérer les informations", Toast.LENGTH_LONG).show();
	  }
	}
}).executeAsync();

Pour pouvoir déclencher la connexion à notre application Facebook, il nous reste trois étapes à mettre en place :

  • créer une session ;
  • définir cette nouvelle session comme la session active ;
  • lancer notre OpenRequest à l’aide de cette session fraîchement créée.
final Session session = new Session.Builder(getActivity().getApplicationContext()).build();
Session.setActiveSession(session);
session.openForRead(openRequest);

Voici donc notre méthode connectToFacebook complète :

public void connectToFacebook() {
  final OpenRequest openRequest = new OpenRequest(getActivity()).setPermissions(Arrays.asList("email")).setCallback(new StatusCallback()
  {

    @Override
    public void call(Session session, SessionState state, Exception exception)
    {
      if (session.isOpened() == true)
      {
      	Request.newMeRequest(session, new GraphUserCallback() {
      		@Override
      		public void onCompleted(GraphUser user, Response response) {
      		  if(user != null) {
      			  //on affiche l'e-mailde l'utilisateur
      			  Toast.makeText(getActivity(), user.asMap().get("email").toString(), Toast.LENGTH_LONG).show();
      		  }
      		  else {
      			  //on affiche un message d'erreur
      			  Toast.makeText(getActivity(), "Impossible de récupérer les informations", Toast.LENGTH_LONG).show();
      		  }
      		}
      	}).executeAsync();

      }
    }

  });

  final Session session = new Session.Builder(getActivity().getApplicationContext()).build();
  Session.setActiveSession(session);
  session.openForRead(openRequest);
}

Voici alors quelques captures d’écran de la connexion à Facebook :

Commentaires