Cet article est une version écrite de la
présentation que j'ai pu faire au BOF dernier de Sfeir.
Pourquoi ?
Faire connaitre son application est une problématique courante auquel est
confronté le développeur Android. Donner un aspect "social" à son application
peut être une solution. Facebook est aujourd'hui une référence absolue en
matière de réseau social et peut donc contribuer à répondre à cette
problématique grace aux services qu'ils expose pour les développeurs. Voici
quelles fonctionnalités qui pourrait donner la dimension sociale
voulue :
- Publier sur son mur : exprimer son avis.
- Organisation d'évènements et inviter des amis à y participer
- Checkins : marquer sa position
Néanmoins l'intégration de Facebook dans une application Android peut
susciter une certaine crainte de la part des utilisateurs :
- Si je dois m'authentifier au travers de l'application, n'y a t-il pas un
risque qu'on me vole mes identifiants ? De plus, le fait de devoir me
rentrer mes identifiants va certainement freiner l'envie de l'utilisateur de
s'exprimer
- Cette application ne risque t-elle pas de d'acceder à mes informations pour
les renvendre et ma boite mail va être innondées de spam ?
Quoi ?
Le SDK Facebook constitue une solution pour le développeur Android. En
s'appuyant sur l'application officielle, la connexion est ainsi quasiment
invisible. Celle çi fait seulement valider à l'application les droits dont
dispose l'application sur le compte de l'utilisateur.
Ce SDK n'est qu'un simple adaptateur entre du code en java et la Graph API. Né dans
l'esprit de Mark Zuckerberg, elle permet d'accéder et d'interagir avec les
données Facebook. En terme plus courant, c'est simplement un ensemble de
services REST produisant du JSon.
Imaginons que je souhaite publier sur mon mur, la documentation nous
donne :

La requête à adresser sera : me/feed Et nécessitera
l'autorisation de publication de flux.
Comment ?
Tout d'abord, il faut télécharger le SDK. Celui fonctionnant
sur le principe d'une library
android, il suffit d'ajouter la dépendance nécessaire. Le SDK est fourni
avec quelques exemples de manipulation de l'api. Il faudra aussi enregistrer
son application sur Facebook. Déclarez vous en tant que développeur en donnant
votre numéro de téléphone si cela n'est pas déjà le cas. La déclaration de
l'application permettra permettra d'obtenir un identifiant d'application. Celui
ci sera utilisé dans le code Android. Et pour finir la dernière étape : la
création de la clé d'après le certificat qui signe l'apk :
keytool -exportcert -alias monApplication -keystore ~/.android/monApplication.keystore | openssl sha1 -binary | openssl base64
Pour les utilisateurs de Windows, il est recommandé de passer par un outil
comme cygwin pour éviter des problèmes de génération avec openssl.
Sans cette clé configuré, il sera impossible à l'application d'accéder aux
services Facebook. L'avantage est que même si le code Android est décompilé, il
sera impossible d'utiliser le compte de l'application. L'inconvénient est que
pour tester le bon fonctionnement, il faudra générer un apk signé à chaque fois
que ce soit pour un téléphone, ou sur l'émulateur.
Il ne reste plus qu'à coder
Si votre application ne possède pas le droit d'accès à internet, n'oublier
pas de le rajouter dans le fichier AndroidManifest.
<uses-permission android:name="android.permission.INTERNET"/>
La majeure partie du SDK est rassemblée dans l'objet Facebook Pour
instancier cet objet, il suffit de lui passer en paramètre l'identifiant de
l'application.
private static final Facebook mFacebook = new Facebook(FACEBOOK_APP_ID);
Un aspect primordial dans une application Android est la gestion asynchrone
des tâches dès lors que l'on execute.
private static final AsyncFacebookRunner mAsyncFacebookRunner =
new AsyncFacebookRunner(mFacebook);
Lors sa tentative de connexion, le SDK envoie un intent à l'application
officielle Facebook. Il est donc important de spécifier le code retour que
devra avoir de cette activité, surtout si la votre utilise aussi ce
mécanisme.
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == FACEBOOK_REQUEST_CODE){// Retour de login facebook
FacebookFunctions.handleLoginResult(resultCode, data);
}
}
C'est lors de la demande de connexion que sera passé ce code retour. Cette
demande doit aussi spécifier quelles sont les permissions requises par
l'application.
private static final String PUBLISH_PERMISSION = "publish_stream";
private static final String[] PERMISSIONS = new String[] { PUBLISH_PERMISSION };
mFacebook.authorize(activity, PERMISSIONS, facebookRequestCode, new LoginDialogListener());
Quant à l'action de publication sur le mur, c'est une simple wrapping de
requête web :
public static void publishCommentOnWall(String comment, PocRequestListener requestListener){
final Bundle parameters = new Bundle();
parameters.putString(GP_LINK_PARAM_FEED, ANDROID_URL);
parameters.putString(GP_NAME_PARAM_FEED, "Android");
parameters.putString(GP_PICTURE_PARAM_FEED, ANDROID_IMAGE_URL);
parameters.putString(GP_DESCRIPTION_PARAM_FEED, comment);
mAsyncFacebookRunner.request(GP_ME_FEED_URI,
parameters, GP_POST_REQUEST, requestListener, null);
}
Les paramètres de la méthode request sont :
- La requête à effectuée, soit notre me/feed
- Les paramètre de cette requête.
- Le type de requête, soit du POST
- Un callback de réponse.
- Un objet quelconque de synchronisation qui sert à identifier les appels
lorsqu'on en fait plusieurs en même temps. Il est facultatif.
J'ai moi même réalisé l'intégration de Facebook au sein de Keoli TV, une application Android
permettant de donner le programme TV en temps réel, projet personnel sur lequel
je travail avec quelques amis.
Le code complet est disponible ici