web-dev-qa-db-fra.com

Comment se déconnecter par programme du Facebook SDK 3.0 sans utiliser le bouton de connexion / déconnexion de Facebook?

Le titre dit tout. J'utilise un bouton personnalisé pour récupérer les informations de l'utilisateur sur Facebook (à des fins "d'inscription"). Cependant, je ne veux pas que l'application se souvienne du dernier utilisateur enregistré, ni de la personne actuellement connectée via l'application native Facebook. Je veux que l'activité de connexion à Facebook apparaisse à chaque fois. C'est pourquoi je souhaite déconnecter par programme tous les utilisateurs précédents.

Comment puis je faire ça? Voici comment je me connecte:

private void signInWithFacebook() {

    SessionTracker sessionTracker = new SessionTracker(getBaseContext(), new StatusCallback() 
    {
        @Override
        public void call(Session session, SessionState state, Exception exception) { 
        }
    }, null, false);

    String applicationId = Utility.getMetadataApplicationId(getBaseContext());
    mCurrentSession = sessionTracker.getSession();

    if (mCurrentSession == null || mCurrentSession.getState().isClosed()) {
        sessionTracker.setSession(null);
        Session session = new Session.Builder(getBaseContext()).setApplicationId(applicationId).build();
        Session.setActiveSession(session);
        mCurrentSession = session;
    }

    if (!mCurrentSession.isOpened()) {
        Session.OpenRequest openRequest = null;
        openRequest = new Session.OpenRequest(RegisterActivity.this);

        if (openRequest != null) {
            openRequest.setPermissions(null);
            openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);

            mCurrentSession.openForRead(openRequest);
        }
    }else {
        Request.executeMeRequestAsync(mCurrentSession, new Request.GraphUserCallback() {
              @Override
              public void onCompleted(GraphUser user, Response response) {
                  fillProfileWithFacebook( user );
              }
            });
    }
}

Idéalement, je passerais un appel au début de cette méthode pour déconnecter tous les utilisateurs précédents.

78

Mise à jour pour le dernier SDK:

Maintenant, la réponse de @ zeuter est correcte pour Facebook SDK v4.7 +:

LoginManager.getInstance().logOut();

Réponse originale:

S'il vous plaît ne pas utiliser SessionTracker. Il s'agit d'une classe interne (paquet privé) et n'est pas destinée à être consommée dans le cadre de l'API publique. En tant que telle, son API peut changer à tout moment sans garantie de compatibilité avec les versions antérieures. Vous devriez être capable de vous débarrasser de toutes les instances de SessionTracker dans votre code, et utilisez simplement la session active à la place.

Pour répondre à votre question, si vous ne souhaitez pas conserver de données de session, appelez simplement closeAndClearTokenInformation à la fermeture de votre application.

157
Ming Li

Cette méthode vous aidera à vous déconnecter de Facebook par programmation dans Android

/**
 * Logout From Facebook 
 */
public static void callFacebookLogout(Context context) {
    Session session = Session.getActiveSession();
    if (session != null) {

        if (!session.isClosed()) {
            session.closeAndClearTokenInformation();
            //clear your preferences if saved
        }
    } else {

        session = new Session(context);
        Session.setActiveSession(session);

        session.closeAndClearTokenInformation();
            //clear your preferences if saved

    }

}
87
Rikin Prajapati

Depuis Facebook Android SDK v4.0 (voir changelog )), vous devez exécuter les tâches suivantes:

LoginManager.getInstance().logOut();
65
zeuter

Voici l'extrait qui m'a permis de me déconnecter par programme de Facebook. Faites-moi savoir si vous voyez quelque chose que je pourrais avoir besoin d'améliorer.

private void logout(){
    // clear any user information
    mApp.clearUserPrefs();
    // find the active session which can only be facebook in my app
    Session session = Session.getActiveSession();
    // run the closeAndClearTokenInformation which does the following
    // DOCS : Closes the local in-memory Session object and clears any persistent 
    // cache related to the Session.
    session.closeAndClearTokenInformation();
    // return the user to the login screen
    startActivity(new Intent(getApplicationContext(), LoginActivity.class));
    // make sure the user can not access the page after he/she is logged out
    // clear the activity stack
    finish();
}
27
jpotts18

Depuis Facebook Android SDK v4.0, vous devez exécuter les tâches suivantes:

LoginManager.getInstance().logOut();

Ce n'est pas suffisant. Cela effacera simplement le jeton d'accès et le profil mis en cache afin que AccessToken.getCurrentAccessToken() et Profile.getCurrentProfile() deviennent désormais nuls.

Pour vous déconnecter complètement, vous devez révoquer les autorisations, puis appeler LoginManager.getInstance().logOut();. Pour révoquer l'autorisation, exécutez l'API graphique suivante -

    GraphRequest delPermRequest = new GraphRequest(AccessToken.getCurrentAccessToken(), "/{user-id}/permissions/", null, HttpMethod.DELETE, new GraphRequest.Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {
            if(graphResponse!=null){
                FacebookRequestError error =graphResponse.getError();
                if(error!=null){
                    Log.e(TAG, error.toString());
                }else {
                    finish();
                }
            }
        }
    });
    Log.d(TAG,"Executing revoke permissions with graph path" + delPermRequest.getGraphPath());
    delPermRequest.executeAsync();
12
Aniket Thakur

La classe de session a été supprimée du SDK 4.0. La gestion de la connexion se fait via la classe LoginManager . Alors:

mLoginManager = LoginManager.getInstance();
mLoginManager.logOut();

Comme la référence Mise à niveau vers SDK 4. dit:

Session supprimée - Les classes AccessToken, LoginManager et CallbackManager remplacent et remplacent les fonctionnalités de la classe Session.

8
luizfelippe

Oui, comme @luizfelippe l'a mentionné Session la classe a été supprimée depuis SDK 4.0. Nous devons utiliser LoginManager.

Je viens de regarder dans LoginButton classe pour la déconnexion. Ils font ce genre de vérification. Ils ne se déconnectent que si accessToken n'est pas nul. Donc, je pense que c'est mieux d'avoir ceci dans notre code aussi ..

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
    LoginManager.getInstance().logOut();
}
3
SureshCS50
private Session.StatusCallback statusCallback = new SessionStatusCallback();

logout.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
Session.openActiveSession(this, true, statusCallback);  
}
});

private class SessionStatusCallback implements Session.StatusCallback {
@Override
public void call(Session session, SessionState state,
Exception exception) {
session.closeAndClearTokenInformation();    
}
}
0
selva_pollachi

Facebook propose deux méthodes pour se connecter et se déconnecter d'un compte. L'une consiste à utiliser LoginButton et l'autre, à LoginManager. LoginButton est juste un bouton sur lequel on clique, la connexion est accomplie. De l'autre côté, LoginManager le fait tout seul. Dans votre cas, vous avez utilisé LoginManager pour vous déconnecter automatiquement.

LoginManager.getInstance().logout() cela fonctionne-t-il pour vous.

0
aravindkanna