it-swarm-es.com

¿Cómo cerrar sesión en el SDK 3.0 de Facebook sin usar el botón de inicio/cierre de sesión de Facebook?

El título lo dice todo. Estoy usando un botón personalizado para obtener la información de Facebook del usuario (para propósitos de "registro"). Sin embargo, no quiero que la aplicación recuerde al último usuario registrado, ni a la persona que ha iniciado sesión actualmente 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 desconectar a los usuarios anteriores mediante programación.

¿Cómo puedo hacer eso? Así es como hago el 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 );
              }
            });
    }
}

Lo ideal sería realizar una llamada al inicio de este método para cerrar la sesión de cualquier usuario anterior.

77

Actualización para el último SDK:

Ahora, la respuesta de @zeuter es correcta para Facebook SDK v4.7 +:

LoginManager.getInstance().logOut();

Respuesta original:

Por favor, no utilice SessionTracker. Es una clase interna (paquete privado) y no está destinada a ser consumida como parte de la API pública. Como tal, su API puede cambiar en cualquier momento sin ninguna garantía de compatibilidad con versiones anteriores. Debería poder deshacerse de todas las instancias de SessionTracker en su código, y simplemente usar la sesión activa en su lugar.

Para responder a su pregunta, si no desea conservar ningún dato de sesión, simplemente llame a closeAndClearTokenInformation cuando se cierre su aplicación.

156
Ming Li

Este método te ayudará a cerrar sesión en Facebook programáticamente 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

    }

}
87
Rikin Prajapati

Desde Android SDK v4.0 de Facebook (ver changelog ) necesita ejecutar lo siguiente:

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

Aquí hay un fragmento que me permitió cerrar sesión de manera programática desde 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();
}
27
jpotts18

Desde Android SDK v4.0 de Facebook necesitas ejecutar lo siguiente:

LoginManager.getInstance().logOut();

Esto no es suficiente. Esto simplemente borrará el token y el perfil de acceso en caché para que AccessToken.getCurrentAccessToken() y Profile.getCurrentProfile() se vuelvan nulos.

Para cerrar completamente la sesión, debe revocar los permisos y luego llamar a LoginManager.getInstance().logOut();. Para revocar el permiso, ejecute la API grafica -

    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

Session class se ha eliminado en SDK 4.0. La gestión de inicio de sesión se realiza a través de la clase LoginManager . Asi que:

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

Como referencia Actualizar a SDK 4.0 dice:

Session Removed - Las clases AccessToken, LoginManager y CallbackManager reemplazan y reemplazan la funcionalidad en la clase Session.

8
luizfelippe

Sí, como @luizfelippe mencionó Session la clase se ha eliminado desde SDK 4.0. Necesitamos usar LoginManager.

Acabo de ver la clase LoginButton para cerrar la sesión. Ellos están haciendo este tipo de cheque. Solo se desconecta si accessToken no es nulo. Entonces, creo que es mejor tener esto en nuestro código también ..

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 proporciona dos formas de iniciar sesión y cerrar sesión desde una cuenta. Una es usar LoginButton y la otra 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, debe usar LoginManager para cerrar sesión automáticamente.

LoginManager.getInstance().logout() hace este trabajo para usted.

0
aravindkanna