webentwicklung-frage-antwort-db.com.de

Wie kann ich mich programmgesteuert von Facebook SDK 3.0 abmelden, ohne die Facebook-Login / Logout-Schaltfläche zu verwenden?

Der Titel sagt schon alles. Ich verwende eine benutzerdefinierte Schaltfläche, um die Facebook-Informationen des Benutzers abzurufen (für "Anmeldezwecke"). Ich möchte jedoch nicht, dass sich die App an den zuletzt registrierten Benutzer oder die aktuell über die native Facebook-App angemeldete Person erinnert. Ich möchte, dass die Facebook-Anmeldeaktivität jedes Mal angezeigt wird. Aus diesem Grund möchte ich frühere Benutzer programmgesteuert abmelden.

Wie kann ich das machen? So mache ich den Login:

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

Idealerweise würde ich zu Beginn dieser Methode einen Anruf tätigen, um frühere Benutzer abzumelden.

78

Update für das neueste SDK:

Jetzt ist die Antwort von @ zeuter für Facebook SDK v4.7 + richtig:

LoginManager.getInstance().logOut();

Ursprüngliche Antwort:

Bitte verwenden Sie SessionTracker nicht. Es handelt sich um eine interne (paketprivate) Klasse, die nicht als Teil der öffentlichen API verwendet werden soll. Daher kann sich die API jederzeit ohne Gewährleistung der Abwärtskompatibilität ändern. Sie sollten in der Lage sein, alle Instanzen von SessionTracker in Ihrem Code zu entfernen und stattdessen einfach die aktive Sitzung zu verwenden.

Um Ihre Frage zu beantworten, rufen Sie einfach closeAndClearTokenInformation auf, wenn Ihre App geschlossen wird, wenn Sie keine Sitzungsdaten behalten möchten.

157
Ming Li

Mit dieser Methode können Sie sich in Android programmgesteuert von Facebook abmelden

/**
 * 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

Seit Facebooks Android SDK v4.0 (siehe changelog ) musst du Folgendes ausführen:

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

Hier ist ein Ausschnitt, mit dem ich mich programmgesteuert von Facebook abmelden konnte. Lassen Sie mich wissen, wenn Sie etwas sehen, das ich möglicherweise verbessern muss.

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

Seit dem Android SDK v4.0 von Facebook müssen Sie Folgendes ausführen:

LoginManager.getInstance().logOut();

Das reicht nicht aus. Dadurch werden zwischengespeichertes Zugriffstoken und Profil einfach gelöscht, sodass AccessToken.getCurrentAccessToken() und Profile.getCurrentProfile() jetzt null werden.

Um sich vollständig abzumelden, müssen Sie die Berechtigungen entziehen und dann LoginManager.getInstance().logOut(); aufrufen. Um die Berechtigung zu widerrufen, führen Sie die folgende Grafik-API aus:

    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

Die Sitzungsklasse wurde im SDK 4.0 entfernt. Das Login-Management erfolgt über die Klasse LoginManager . So:

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

Als Referenz pgrade auf SDK 4. gilt:

Sitzung entfernt - Die AccessToken-, LoginManager- und CallbackManager-Klassen ersetzen und ersetzen die Funktionen in der Session-Klasse.

8
luizfelippe

Yup, wie @luizfelippe erwähnt Session Klasse wurde entfernt seit SDK 4.0. Wir müssen LoginManager verwenden.

Ich habe gerade in die LoginButton Klasse für die Abmeldung geschaut. Sie machen diese Art von Kontrolle. Sie melden sich nur ab, wenn accessToken nicht null ist. Also, ich denke, es ist besser, dies auch in unserem Code zu haben.

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 bietet zwei Möglichkeiten zum Anmelden und Abmelden von einem Konto. Zum einen LoginButton und zum anderen LoginManager. LoginButton ist nur eine Schaltfläche, mit der beim Anklicken die Anmeldung durchgeführt wird. Auf der anderen Seite erledigt LoginManager dies alleine. In Ihrem Fall verwenden Sie LoginManager, um sich automatisch abzumelden.

LoginManager.getInstance().logout() erledigt dies für Sie.

0
aravindkanna