J'ai une fonctionnalité sur mon application Android où l'utilisateur autorise l'application et partage un lien.
Je dois également donner à l'utilisateur la possibilité de se déconnecter de Facebook et désactiver ce bouton de manière conditionnelle si l'utilisateur n'est pas connecté int (ou s'il n'a pas autorisé l'application).
Je n'arrive pas à trouver l'appel API sur le SDK Android qui me permettrait de demander à FB si l'utilisateur est connecté ou non.
Ce que j'ai trouvé est getAccessExpires()
:
Récupérez le délai d'expiration de la session en cours (en millisecondes depuis Unix Epoch) ou 0 si la session n'expire pas ou n'existe pas.
Est-ce que vérifier si la session est égale à 0 sera le bon choix? Ou y a-t-il quelque chose qui me manque?
J'ai eu du mal à trouver une réponse simple à cette question dans la documentation FB. À l'aide du Kit de développement logiciel (SDK) Facebook version 3.0, je pense qu'il y a deux façons de vérifier si un utilisateur est connecté.
1) Utilisez Session.isOpened()
Pour utiliser cette méthode, vous devez extraire la session active avec getActiveSession()
puis (voici la partie déroutante) pour déchiffrer si la session est dans un état où l'utilisateur est connecté ou non. Je pense que la seule chose qui compte pour un utilisateur connecté est si la session isOpened()
. Donc, si la session n'est pas null
et qu'elle est ouverte, l'utilisateur est connecté. Dans tous les autres cas, l'utilisateur est déconnecté (gardez à l'esprit que Session
peut avoir des états autres qu'ouvert et fermé).
public boolean isLoggedIn() {
Session session = Session.getActiveSession();
return (session != null && session.isOpened());
}
Il y a une autre façon d'écrire cette fonction, détaillée dans cette réponse , mais je ne sais pas quelle approche est la plus claire ou "meilleure pratique".
2) Surveiller constamment les changements d'état avec Session.StatusCallback
et UiLifecycleHelper
Si vous suivez ce tutorial vous allez configurer la UiLifecycleHelper
et enregistrer un objet Session.StatusCallback
avec celui-ci lors de l’instanciation. Il existe une méthode de rappel, call()
, que vous écrasez dans Session.StatusCallback
et qui sera censée être appelée à chaque fois que l'utilisateur se connecte/déconnecte. Dans cette méthode, vous pouvez peut-être savoir si l'utilisateur est connecté ou non. Peut-être quelque chose comme ça:
private boolean isLoggedIn = false; // by default assume not logged in
private Session.StatusCallback callback = new Session.StatusCallback() {
@Override
public void call(Session session, SessionState state, Exception exception) {
if (state.isOpened()) { //note: I think session.isOpened() is the same
isLoggedIn = true;
} else if (state.isClosed()) {
isLoggedIn = false;
}
}
};
public boolean isLoggedIn() {
return isLoggedIn;
}
Je pense que la méthode 1 est plus simple et constitue probablement le meilleur choix.
En guise de remarque, est-ce que quelqu'un peut expliquer pourquoi le didacticiel aime appeler state.isOpened()
au lieu de session.isOpened()
puisque les deux semblent interchangeables (session.isOpened()
semble simplement appeler la version state
.
Note aux lecteurs: Ceci est maintenant déconseillé dans le nouveau SDK FB 3.0.
facebook.isSessionValid()
renvoie true si l'utilisateur est connecté, false sinon.
Session.getActiveSession().isOpened()
renvoie true si l'utilisateur est connecté, false sinon
Android Studio avec:
compile 'com.facebook.Android:facebook-Android-sdk:4.0.1'
puis vérifiez votre connexion comme suit:
private void facebookPost() {
//check login
AccessToken accessToken = AccessToken.getCurrentAccessToken();
if (accessToken == null) {
Log.d(TAG, ">>>" + "Signed Out");
} else {
Log.d(TAG, ">>>" + "Signed In");
}
}
Pour Facebook Android SDK 4.x, vous devez utiliser le "AccessToken.getCurrentAccessToken ()" comme l'a dit @Diljeet mais son chèque n'a pas fonctionné pour moi, je l'ai finalement vérifié en faisant:
Activité "onCreate":
facebookAccessToken = AccessToken.getCurrentAccessToken();
Pour vérifier si la session est toujours active (je l’ai faite avec la méthode "onResume" mais faites-le là où vous en avez besoin):
if(facebookAccessToken != null){
sessionExpired = facebookAccessToken.isExpired();
}else{
sessionExpired = true;
}
Plus d'infos sur https://developers.facebook.com/docs/facebook-login/Android
J'ai eu le même problème. Voici ma solution à l'aide du SDK 4.0:
Tout d’abord, dans votre activité concernant la vérification de la connexion, veillez à appeler ce principal:
FacebookSdk.sdkInitialize(this.getApplicationContext());
Dans votre méthode onCreate, mettez ceci:
updateWithToken(AccessToken.getCurrentAccessToken());
new AccessTokenTracker() {
@Override
protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken newAccessToken) {
updateWithToken(newAccessToken, handler);
}
};
Ajoutez ensuite la méthode appelée:
private void updateWithToken(AccessToken currentAccessToken) {
if (currentAccessToken != null) {
fillUIWithFacebookInfos(handler);
} else {
login();
}
}
De cette façon, l’utilisateur déjà connecté et l’utilisateur nouvellement connecté seront traités.
Cela semble fonctionner assez bien avec le nouveau sdk.
private boolean isFacebookLoggedIn(){
Session session = Session.getActiveSession();
if (session != null) {
//Session can be open, check for valid token
if (!session.isClosed()) {
if(!session.getAccessToken().equalsIgnoreCase("")){
return true;
}
}
}
return false;
}