Facebook SDK 4 pour Android - comment se déconnecter par programme

112

Récemment, Facebook a publié le SDK 4 avec de nouvelles mises à jour intéressantes. J'ai essayé de passer au SDK4 pour utiliser de nouvelles fonctionnalités, cependant, j'ai du mal avec la fonction de connexion de Facebook.

Jusqu'à présent, pour me déconnecter de Facebook par programme, j'ai utilisé:

Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();

Mais SDK4 semble ne plus prendre en charge Session, et dans les documents officiels, ils mentionnent:

Il existe deux façons de mettre en œuvre la connexion Facebook sur Android:

Classe LoginButton - qui fournit un bouton que vous pouvez ajouter à votre interface utilisateur. Il suit le jeton d'accès actuel et peut connecter et déconnecter des personnes.

Eh bien, il semble qu'il n'y ait aucun moyen de se déconnecter de Facebook par programme, sauf en utilisant LoginButton. N'importe qui a une idée, partagez-la ici.

franco phong
la source

Réponses:

276

Vous pouvez utiliser LoginManager.getInstance().logOut();, même si vous utilisez LoginButton car

Cet élément d'interface utilisateur encapsule les fonctionnalités disponibles dans LoginManager.

EDIT: Juste pour mentionner que cela fonctionne pour Facebook SDK v4 . Je ne sais pas s'ils le changeront à l'avenir.

@ comme mention batoutofhell, n'oubliez pas de mettre FacebookSdk.sdkInitialize(getApplicationContext());pour initialiser le sdk facebook. S'il vous plaît voir ici pour les détails.

stackex
la source
2
Je tiens à mentionner puisqu'il s'agit du meilleur résultat Google, mon application s'est plantée en essayant de me déconnecter jusqu'à ce que j'aie ajouté cette ligne en premier: FacebookSdk.sdkInitialize (this.getApplicationContext ()); LoginManager.getInstance (). LogOut ();
batoutofhell
7
Après la déconnexion, cela ne me permettra pas de me connecter à nouveau. Y a-t-il un moyen de se reconnecter après avoir fait LoginManager.getInstance (). LogOut ();
AndroidDev
1
Pourquoi devrions-nous appeler FacebookSdk.sdkInitialize, car il a déjà été initialisé dans onCreate?
CoolMind
1
LoginManager.logOut () J'ai utilisé ceci, cela fonctionne correctement
Erum
1
@Erum Il n'y a pas de méthode de ce type pour LoginManager.logOut()le moment dans FB SDK v4.23.0
Gem
61

SDK4, si vous souhaitez complètement dissocier, assurez-vous de supprimer également l'application du compte Facebook de l'utilisateur. Cette méthode déconnecte complètement l'utilisateur:

public void disconnectFromFacebook() {

    if (AccessToken.getCurrentAccessToken() == null) {
        return; // already logged out
    }

    new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            LoginManager.getInstance().logOut();

        }
    }).executeAsync();
}
Franc
la source
C'est exactement ce que je voulais!
Sash_KP
Cela signifie que je dois supprimer l'application Facebook et le message Facebook pour terminer la déconnexion de mon application?
phongvan
1
Cette réponse garantit que l'utilisateur est complètement déconnecté. Pour être à 100%, il faut inclure FacebookSdk.sdkInitialize (getApplicationContext ());
Sandro Wiggers
Dans le rappel, j'ai également ajouté @Override public void onCompleted (GraphResponse graphResponse) {AccessToken.setCurrentAccessToken (null); LoginManager.getInstance (). LogOut (); }
Sandro Wiggers
1
@voghDev onCompleted ne revient pas sur le thread de l'interface utilisateur je crois, donc il ne le bloque pas lorsque vous appelez logOut là-bas.
Frank
9

Vous pouvez utiliser LoginManager.logOut()

Consultez https://developers.facebook.com/docs/reference/android/current/class/LoginManager/

Chris Pan
la source
2
Cela fonctionne si vous utilisez LoginManager. Existe-t-il un moyen de se déconnecter par programme lors de l'utilisation de LoginButton?
Chanté le
Je veux aussi savoir comment nous pouvons nous déconnecter lorsque vous utilisez LoginButton
sarath
il suffit d'utiliser le LoginButton, cliquez dessus à nouveau puis il sera déconnecté
Beeing Jk
7

Pour le gérer avec le loginButton:

//Check if user is currently logged in
        if (AccessToken.getCurrentAccessToken() != null && com.facebook.Profile.getCurrentProfile() != null){
            //Logged in so show the login button
            fbLogin.setVisibility(View.VISIBLE);
            fbLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
//log out
                    LoginManager.getInstance().logOut();
                    gotoLogin();
                }
            });
        }
Stephen
la source
Hey Stevie, Quand j'ai appelé la méthode logOut () comme vous l'avez mentionné dans votre réponse, cela m'a donné l'erreur "java.lang.SecurityException: Permission Denial: get / set setting for user demande à s'exécuter en tant qu'utilisateur -2 mais appelle de l'utilisateur 0; ". Il me demande d'ajouter une autorisation dans le fichier manifeste. Comment puis-je le résoudre car je ne veux pas donner cette autorisation car la déconnexion devrait être une procédure normale.
Aditya
@Aditya Vous n'avez besoin que de l'autorisation Internet pour l'application. <uses-permission android:name="android.permission.INTERNET" />
stephen
Mais j'obtiens l'erreur ci-dessus, si je ne l'ajoute pas. Si possible, pouvez-vous s'il vous plaît partager un échantillon Facebook qui a un bouton de connexion personnalisé et un bouton de déconnexion personnalisé ??
Aditya le
@Aditya dans cet exemple, j'utilise le bouton de connexion facebook
stephen
4

Vous pouvez vous déconnecter en utilisant LoginManager mais vous devez également utiliser la requête graphique. Je parle de vous déconnecter complètement afin que la prochaine fois, vous puissiez vous connecter avec un compte différent.

new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            SharedPreferences pref = DashBoard.this.getPreferences(Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();
            editor.clear();
            editor.commit();
            LoginManager.getInstance().logOut();

            Intent logoutint = new Intent(DashBoard.this,MainActivity.class);
            logoutint.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
               startActivity(logoutint);

        }
    }).executeAsync();

À l'aide des préférences partagées, vous pouvez vous déconnecter complètement et la prochaine fois, vous pouvez vous connecter avec un compte différent.

Ritesh Jha
la source
1

Frank version kotlin:

 fun disconnectFromFacebook() {
    if (AccessToken.getCurrentAccessToken() == null) {
        return  // already logged out
    }
    GraphRequest(
        AccessToken.getCurrentAccessToken(),
        "/me/permissions/",
        null,
        HttpMethod.DELETE,
        GraphRequest.Callback {
            LoginManager.getInstance().logOut()
        }).executeAsync()
}
Andrea Leganza
la source