Facebook SDK 4 para Android: cómo cerrar sesión mediante programación

112

Recientemente, Facebook lanzó SDK 4 con actualizaciones nuevas y geniales. Intenté cambiar a SDK4 para usar nuevas funciones, sin embargo, tengo problemas con la función de inicio de sesión de Facebook.

Hasta ahora, para cerrar sesión en Facebook mediante programación, usé:

Session session = Session.getActiveSession();
session.closeAndClearTokenInformation();

Pero SDK4 parece que ya no es compatible con Session, y en los documentos oficiales, mencionan:

Hay dos formas de implementar el inicio de sesión de Facebook en Android:

Clase LoginButton: proporciona un botón que puede agregar a su interfaz de usuario. Sigue el token de acceso actual y puede iniciar y cerrar la sesión de personas.

Bueno, parece que no hay forma de cerrar sesión en Facebook mediante programación, excepto mediante LoginButton. Si alguien tiene alguna idea, compártala aquí.

Franco Phong
fuente

Respuestas:

276

Puede usar LoginManager.getInstance().logOut();, incluso si usa LoginButton porque

Este elemento de la interfaz de usuario envuelve la funcionalidad disponible en LoginManager.

EDITAR: Solo para mencionar que esto funciona para Facebook SDK v4 . No sé si lo cambiarán en el futuro.

@como menciona batoutofhell, no olvide poner FacebookSdk.sdkInitialize(getApplicationContext());para inicializar el sdk de Facebook. Consulte aquí los detalles.

stackex
fuente
2
Quiero mencionar que, dado que este es el resultado principal de Google, mi aplicación se bloqueó al intentar cerrar la sesión hasta que agregué esta línea primero: FacebookSdk.sdkInitialize (this.getApplicationContext ()); LoginManager.getInstance (). LogOut ();
batoutofhell
7
Después de cerrar la sesión, no me permitirá iniciar sesión de nuevo. ¿Hay alguna forma de iniciar sesión nuevamente después de que hice LoginManager.getInstance (). LogOut ();
AndroidDev
1
¿Por qué deberíamos llamar a FacebookSdk.sdkInitialize, ya que ya se ha inicializado en onCreate?
CoolMind
1
LoginManager.logOut () utilicé esto, funciona correctamente
Erum
1
@Erum No existe tal método a LoginManager.logOut()partir de ahora en FB SDK v4.23.0
Gem
61

SDK4, si desea desvincularse por completo, asegúrese de eliminar también la aplicación de la cuenta de Facebook del usuario. Este método desconecta al usuario por completo:

public void disconnectFromFacebook() {

    if (AccessToken.getCurrentAccessToken() == null) {
        return; // already logged out
    }

    new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            LoginManager.getInstance().logOut();

        }
    }).executeAsync();
}
Franco
fuente
¡Esto es exactamente lo que quería!
Sash_KP
¿Eso significa que debo eliminar la aplicación de Facebook y el mensaje de Facebook para completar la sesión de mi aplicación?
phongvan
1
Esta respuesta asegura que el usuario cierre completamente la sesión. Solo para ser 100% es necesario incluir FacebookSdk.sdkInitialize (getApplicationContext ());
Sandro Wiggers
En la devolución de llamada también agregué @Override public void onCompleted (GraphResponse graphResponse) {AccessToken.setCurrentAccessToken (null); LoginManager.getInstance (). LogOut (); }
Sandro Wiggers
1
@voghDev onCompleted no vuelve al hilo de la interfaz de usuario, creo, por lo que no lo bloquea cuando llamas a logOut allí.
Frank
9

Puedes usar LoginManager.logOut()

Consulte https://developers.facebook.com/docs/reference/android/current/class/LoginManager/

Chris Pan
fuente
2
Eso funciona si está utilizando LoginManager. ¿Hay alguna forma de cerrar sesión mediante programación cuando se usa LoginButton?
Chamuscado
También quiero saber cómo podemos cerrar la sesión cuando usamos LoginButton
sarath
solo use el botón de inicio de sesión, haga clic en él nuevamente y luego se cerrará la sesión
Beeing Jk
7

Para manejarlo con el loginButton:

//Check if user is currently logged in
        if (AccessToken.getCurrentAccessToken() != null && com.facebook.Profile.getCurrentProfile() != null){
            //Logged in so show the login button
            fbLogin.setVisibility(View.VISIBLE);
            fbLogin.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
//log out
                    LoginManager.getInstance().logOut();
                    gotoLogin();
                }
            });
        }
Stephen
fuente
Hola Stevie, cuando llamé al método logOut () como mencionaste en tu respuesta, me dio el error "java.lang.SecurityException: Permission Denial: get / set setting for user pide ejecutar como usuario -2 pero está llamando desde el usuario 0; ". Me está pidiendo que agregue un permiso en el archivo de manifiesto. ¿Cómo puedo resolverlo porque no quiero otorgar este permiso, ya que el cierre de sesión debería ser un procedimiento normal?
Aditya
@Aditya Solo necesita el permiso de Internet para la aplicación. <uses-permission android:name="android.permission.INTERNET" />
Stephen
Pero obtengo el error anterior, si no lo agrego. Si es posible, ¿puede compartir una muestra de Facebook que tenga un botón de inicio de sesión personalizado y un botón de cierre de sesión personalizado?
Aditya
@Aditya en este ejemplo estoy usando el botón de inicio de sesión de Facebook
stephen
4

Puede cerrar la sesión utilizando LoginManager, pero también debe utilizar la solicitud de gráfico. Estoy hablando de cerrar la sesión por completo para que la próxima vez pueda iniciar sesión con una cuenta diferente.

new GraphRequest(AccessToken.getCurrentAccessToken(), "/me/permissions/", null, HttpMethod.DELETE, new GraphRequest
            .Callback() {
        @Override
        public void onCompleted(GraphResponse graphResponse) {

            SharedPreferences pref = DashBoard.this.getPreferences(Context.MODE_PRIVATE);
            SharedPreferences.Editor editor = pref.edit();
            editor.clear();
            editor.commit();
            LoginManager.getInstance().logOut();

            Intent logoutint = new Intent(DashBoard.this,MainActivity.class);
            logoutint.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
               startActivity(logoutint);

        }
    }).executeAsync();

Con la ayuda de las preferencias compartidas aquí, puede cerrar sesión por completo y la próxima vez podrá iniciar sesión con una cuenta diferente.

Ritesh Jha
fuente
1

Versión de Frank kotlin:

 fun disconnectFromFacebook() {
    if (AccessToken.getCurrentAccessToken() == null) {
        return  // already logged out
    }
    GraphRequest(
        AccessToken.getCurrentAccessToken(),
        "/me/permissions/",
        null,
        HttpMethod.DELETE,
        GraphRequest.Callback {
            LoginManager.getInstance().logOut()
        }).executeAsync()
}
Andrea Leganza
fuente