Facebook SDK 4 für Android - wie man sich programmgesteuert abmeldet

112

Vor kurzem hat Facebook SDK 4 mit neuen und coolen Updates veröffentlicht. Ich habe versucht, in SDK4 zu wechseln, um neue Funktionen zu verwenden. Ich habe jedoch Probleme mit der Anmeldefunktion von Facebook.

Bisher habe ich zum programmgesteuerten Abmelden von Facebook Folgendes verwendet:

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

Aber SDK4 scheint Session nicht mehr zu unterstützen, und in offiziellen Dokumenten wird Folgendes erwähnt:

Es gibt zwei Möglichkeiten, die Facebook-Anmeldung unter Android zu implementieren:

LoginButton-Klasse - Enthält eine Schaltfläche, die Sie Ihrer Benutzeroberfläche hinzufügen können. Es folgt dem aktuellen Zugriffstoken und kann Personen an- und abmelden.

Nun, anscheinend gibt es keine Möglichkeit, Facebook programmgesteuert abzumelden, außer mit LoginButton. Jeder, der eine Idee hat, teilt sie bitte hier mit.

Franco Phong
quelle

Antworten:

276

Sie können verwenden LoginManager.getInstance().logOut();, auch wenn Sie LoginButton verwenden, weil

Dieses UI-Element umschließt die im LoginManager verfügbaren Funktionen.

EDIT: Nur um zu erwähnen, dass dies für Facebook SDK v4 funktioniert . Ich weiß nicht, ob sie es in Zukunft ändern werden.

@as batoutofhell erwähnen, vergessen Sie nicht, FacebookSdk.sdkInitialize(getApplicationContext());die Facebook SDK zu initialisieren. Bitte sehen Sie hier für die Details.

Stackex
quelle
2
Da dies das beste Google-Ergebnis ist, stürzte meine App ab, als ich versuchte, mich abzumelden, bis ich zuerst diese Zeile hinzufügte: FacebookSdk.sdkInitialize (this.getApplicationContext ()); LoginManager.getInstance (). LogOut ();
Batoutofhell
7
Nach dem Abmelden kann ich mich nicht mehr anmelden. Gibt es eine Möglichkeit, sich nach LoginManager.getInstance () erneut anzumelden? LogOut ();
AndroidDev
1
Warum sollten wir FacebookSdk.sdkInitialize aufrufen, da es bereits in onCreate initialisiert wurde?
CoolMind
1
LoginManager.logOut () Ich habe dies verwendet, es funktioniert ordnungsgemäß
Erum
1
@Erum Es gibt derzeit keine solche Methode LoginManager.logOut()in FB SDK v4.23.0
Gem
61

Wenn Sie das SDK4 vollständig entkoppeln möchten, entfernen Sie die App auch aus dem Facebook-Konto des Benutzers. Diese Methode trennt den Benutzer vollständig:

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();
}
Frank
quelle
Genau das wollte ich!
Sash_KP
Das heißt, ich muss die Facebook-App und die Facebook-Nachricht entfernen, um mich für meine App abzumelden.
Phongvan
1
Diese Antwort stellt sicher, dass der Benutzer vollständig abgemeldet ist. Um 100% zu sein, muss FacebookSdk.sdkInitialize (getApplicationContext ()) enthalten sein.
Sandro Wiggers
Im Rückruf habe ich auch @Override public void onCompleted (GraphResponse graphResponse) {AccessToken.setCurrentAccessToken (null) hinzugefügt; LoginManager.getInstance (). LogOut (); }
Sandro Wiggers
1
@voghDev onCompleted kommt meines Erachtens nicht auf den UI-Thread zurück und blockiert ihn daher nicht, wenn Sie dort logOut aufrufen.
Frank
9

Sie können verwenden LoginManager.logOut()

Überprüfen Sie https://developers.facebook.com/docs/reference/android/current/class/LoginManager/

Chris Pan
quelle
2
Das funktioniert, wenn Sie LoginManager verwenden. Gibt es eine Möglichkeit, sich bei Verwendung von LoginButton programmgesteuert abzumelden?
Gesungen am
Ich möchte auch wissen, wie wir uns abmelden können, wenn wir LoginButton
Sarath
Verwenden Sie einfach den LoginButton, klicken Sie erneut darauf, dann wird er abgemeldet
Beeing Jk
7

So handhaben Sie es mit dem 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
quelle
Hey Stevie, als ich die logOut () -Methode aufgerufen habe, wie Sie in Ihrer Antwort erwähnt haben, gab es mir den Fehler "java.lang.SecurityException: Berechtigungsverweigerung: get / set-Einstellung für Benutzer fordert die Ausführung als Benutzer -2 auf, ruft aber vom Benutzer auf 0; ". Ich werde gebeten, eine Berechtigung in die Manifestdatei aufzunehmen. Wie kann ich das Problem beheben, da ich diese Berechtigung nicht erteilen möchte, da das Abmelden normal sein sollte?
Aditya
@Aditya Sie benötigen nur die Internetberechtigung für die App. <uses-permission android:name="android.permission.INTERNET" />
Stephen
Aber ich bekomme über Fehler, wenn ich es nicht hinzufüge. Wenn möglich, können Sie bitte ein Facebook-Beispiel mit einer benutzerdefinierten Anmeldeschaltfläche und einer benutzerdefinierten Abmeldeschaltfläche freigeben?
Aditya
@ Aditya in diesem Beispiel Ich benutze den Facebook Login Button
Stephen
4

Sie können sich mit LoginManager abmelden, müssen jedoch auch die Diagrammanforderung verwenden. Ich spreche über das vollständige Abmelden, damit Sie sich das nächste Mal mit einem anderen Konto anmelden können.

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();

Mithilfe der gemeinsamen Einstellungen können Sie sich hier vollständig abmelden und sich das nächste Mal mit einem anderen Konto anmelden.

Ritesh Jha
quelle
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
quelle