El título lo dice todo. Estoy usando un botón personalizado para obtener la información de Facebook del usuario (con el propósito de "registrarse"). Sin embargo, no quiero que la aplicación recuerde al último usuario registrado, ni al que está conectado actualmente en persona a través de la aplicación nativa de Facebook. Quiero que la actividad de inicio de sesión de Facebook aparezca cada vez. Es por eso que quiero cerrar la sesión de los usuarios anteriores mediante programación.
¿Cómo puedo hacer eso? Así es como hago el inicio de sesión:
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 );
}
});
}
}
Idealmente, haría una llamada al comienzo de este método para cerrar la sesión de cualquier usuario anterior.
fuente
Este método le ayudará a cerrar sesión en Facebook mediante programación en 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 } }
fuente
else
parte?Desde el SDK de Android de Facebook v4.0 (consulte el registro de cambios ), debe ejecutar lo siguiente:
LoginManager.getInstance().logOut();
fuente
Aquí hay un fragmento que me permitió cerrar sesión mediante programación en Facebook. Avísame si ves algo que pueda necesitar mejorar.
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(); }
fuente
Desde el SDK de Android de Facebook v4.0, debe ejecutar lo siguiente:
LoginManager.getInstance().logOut();
Esto no es suficiente. Esto simplemente borrará el perfil y el token de acceso en caché para que
AccessToken.getCurrentAccessToken()
yProfile.getCurrentProfile()
ahora se vuelva nulo.Para cerrar la sesión por completo, debe revocar los permisos y luego llamar
LoginManager.getInstance().logOut();
. Para revocar el permiso, ejecute la siguiente API gráfica: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();
fuente
LoginManager.getInstance().logOut();
solo borra la caché local, mientras que laGraphRequest
llamada revoca mediante programación el acceso a la aplicación desde la cuenta de Facebook del usuario. Ambos son necesarios. Ninguno de los dos es suficiente solo.La clase de sesión se ha eliminado en SDK 4.0. La imagen de inicio de sesión se realiza a través de la clase LoginManager . Entonces:
Como dice la referencia Actualización a SDK 4.0 :
fuente
Sí, como mencionó @luizfelippe, la clase Session se eliminó desde el SDK 4.0. Necesitamos usar LoginManager.
Acabo de buscar en la clase LoginButton para cerrar la sesión. Están haciendo este tipo de verificación. Se desconectan solo si accessToken no es nulo. Entonces, creo que es mejor tener esto también en nuestro código.
AccessToken accessToken = AccessToken.getCurrentAccessToken(); if(accessToken != null){ LoginManager.getInstance().logOut(); }
fuente
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(); } }
fuente
Facebook ofrece dos formas de iniciar y cerrar sesión desde una cuenta. Uno es usar LoginButton y el otro es usar LoginManager. LoginButton es solo un botón que, al hacer clic, se realiza el inicio de sesión. Por otro lado, LoginManager hace esto por sí solo. En su caso, ha utilizado LoginManager para cerrar sesión automáticamente.
LoginManager.getInstance().logout()
Esto funciona para tí.fuente