Facebook Facebook SDK 3.0-jak programowo wylogować się z Facebooka bez użycia przycisku logowania/wylogowania?

Tytuł mówi wszystko. Używam niestandardowego przycisku, aby pobrać informacje użytkownika na facebook (w celach" Zarejestruj się"). Jednak nie chcę, aby aplikacja zapamiętała ostatnio Zarejestrowanego Użytkownika, ani aktualnie zalogowaną osobę za pośrednictwem natywnej aplikacji Facebook. Chcę, aby aktywność logowania na Facebook ' u wyskakiwała za każdym razem. Dlatego chcę programowo wylogować wszystkich poprzednich użytkowników.

Jak mogę to zrobić? Tak robię 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 );
              }
            });
    }
}

Najlepiej byłoby zadzwonić na początek tej metody, aby wylogować wszystkich poprzednich użytkowników.

Author: Michael Currie, 2013-01-15

9 answers

Aktualizacja dla najnowszego SDK:

Teraz @zeuter odpowiedź jest poprawna dla Facebook SDK v4. 7+:

LoginManager.getInstance().logOut();

Oryginalna odpowiedź:

Proszę nie używać SessionTracker. Jest to klasa wewnętrzna (package private) i nie jest przeznaczona do użycia jako część publicznego API. W związku z tym jego API może ulec zmianie w dowolnym momencie bez żadnych gwarancji zgodności wstecznej. Powinieneś być w stanie pozbyć się wszystkich instancji SessionTracker w swoim kodzie, a zamiast tego użyj aktywnej sesji.

Aby odpowiedzieć na twoje pytanie, jeśli nie chcesz przechowywać żadnych danych sesji, po prostu zadzwoń closeAndClearTokenInformation po zamknięciu aplikacji.

 153
Author: Ming Li,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 14:00:27

Ta metoda pomoże Ci wylogować się z facebook programowo w Androidzie

/**
 * 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
Author: Rikin Prajapati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-03 05:41:53

Od wersji Facebook Android SDK v4.0 (zobacz changelog) musisz wykonać następujące czynności:

LoginManager.getInstance().logOut();
 65
Author: zeuter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-21 07:22:59

Oto fragment, który pozwolił mi programowo wylogować się z facebook ' a. Daj mi znać, jeśli zobaczysz coś, co będę musiał poprawić.

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
Author: jpotts18,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-19 20:35:20

Od wersji Facebook Android SDK v4. 0 musisz wykonać następujące czynności:

LoginManager.getInstance().logOut();
To nie wystarczy. Spowoduje to po prostu wyczyszczenie buforowanego tokena dostępu i profilu, aby AccessToken.getCurrentAccessToken() i Profile.getCurrentProfile() stały się teraz null.

Aby całkowicie się wylogować, należy odwołać uprawnienia, a następnie zadzwonić LoginManager.getInstance().logOut();. Aby cofnąć pozwolenie, wykonaj następujące polecenie graph API -

    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
Author: Aniket Thakur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-09 10:39:51

Klasa Sesji została usunięta w SDK 4.0. Magement logowania jest wykonywany za pomocą klasy LoginManager . Więc:

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

Jako odniesienie Aktualizacja do SDK 4.0 mówi:

Session Removed - klasy AccessToken, LoginManager i CallbackManager zastępują i zastępują funkcjonalność w klasie Session.

 8
Author: luizfelippe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-29 20:43:17

Tak, jak @luizfelippe wspomniał Sesja klasa została usunięta od SDK 4.0. musimy użyć Loginmanagera.

Właśnie zajrzałem do loginbutton klasy do logowania. Robią takie czeki. Wylogowują się tylko wtedy, gdy accessToken nie jest null. Więc myślę, że lepiej mieć to w naszym kodzie..

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
    LoginManager.getInstance().logOut();
}
 3
Author: SureshCS50,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-07-02 21:21:11
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
Author: selva_pollachi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-22 10:01:51

Facebook udostępnia dwa sposoby logowania i wylogowywania się z konta. Jednym z nich jest użycie LoginButton, a drugim użycie Loginmanagera. LoginButton to tylko przycisk, który po kliknięciu, logowanie jest zakończone. Z drugiej strony LoginManager robi to samo. W Twoim przypadku musisz użyć LoginManager, aby wylogować się automatycznie.

LoginManager.getInstance().logout() czy to działa dla Ciebie.

 0
Author: aravindkanna,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-22 12:28:59