Tytuł mówi wszystko. Używam niestandardowego przycisku, aby pobrać informacje z Facebooka użytkownika (do celów „rejestracji”). Jednak nie chcę, aby aplikacja zapamiętała ostatnio zarejestrowanego użytkownika, ani aktualnie zalogowanego osobiście przez natywną aplikację Facebooka. Chcę, aby aktywność logowania na Facebooku pojawiała się za każdym razem. Dlatego chcę wylogować wszystkich poprzednich użytkowników programowo.
Jak mogę to zrobić? Tak się loguję:
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, gdyby na początku tej metody zadzwonił, aby wylogować poprzednich użytkowników.
źródło
Ta metoda pomoże Ci wylogować się programowo z Facebooka w systemie 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 } }
źródło
Ponieważ Facebook Android SDK v4.0 (patrz dziennik zmian ), musisz wykonać następujące czynności:
LoginManager.getInstance().logOut();
źródło
Oto fragment, który pozwolił mi programowo wylogować się z Facebooka. Daj mi znać, jeśli zobaczysz coś, co powinienem 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(); }
źródło
Ponieważ Facebook Android SDK v4.0, musisz wykonać następujące czynności:
LoginManager.getInstance().logOut();
To nie wystarczy. Spowoduje to po prostu wyczyszczenie przechowywanego w pamięci podręcznej tokenu dostępu i profilu, dzięki czemu
AccessToken.getCurrentAccessToken()
iProfile.getCurrentProfile()
będzie teraz mieć wartość zerową.Aby całkowicie się wylogować, musisz cofnąć uprawnienia, a następnie zadzwonić
LoginManager.getInstance().logOut();
. Aby cofnąć uprawnienia, wykonaj następujące 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();
źródło
LoginManager.getInstance().logOut();
czyści tylko lokalną pamięć podręczną, podczas gdyGraphRequest
wywołanie programowo unieważnia dostęp do aplikacji z konta użytkownika na Facebooku. Oba są konieczne. Samo też nie wystarczy.Klasa sesji została usunięta z pakietu SDK 4.0. Zarządzanie logowaniem odbywa się za pośrednictwem klasy LoginManager . Więc:
Jak mówi odniesienie Upgrading to SDK 4.0 :
źródło
Tak, jak wspomniał @luizfelippe, klasa sesji została usunięta od SDK 4.0. Musimy użyć LoginManagera.
Właśnie zajrzałem do klasy LoginButton, aby się wylogować. Robią tego rodzaju czek. Wylogowuje się tylko wtedy, gdy accessToken nie jest null. Więc myślę, że lepiej mieć to również w naszym kodzie.
AccessToken accessToken = AccessToken.getCurrentAccessToken(); if(accessToken != null){ LoginManager.getInstance().logOut(); }
źródło
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(); } }
źródło
Facebook zapewnia dwa sposoby logowania i wylogowywania się z konta. Jednym z nich jest użycie LoginButton, a drugim LoginManager. LoginButton to po prostu przycisk, którego kliknięcie oznacza zakończenie logowania. Z drugiej strony LoginManager robi to samodzielnie. W twoim przypadku musisz użyć LoginManager do automatycznego wylogowania.
LoginManager.getInstance().logout()
czy to działa dla Ciebie.źródło