¿Cómo cerrar programáticamente desde Facebook SDK 3.0 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 buscar la información de Facebook del usuario (para fines de “registro”). Sin embargo, no quiero que la aplicación recuerde al último usuario registrado ni a la persona que inició 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 cerrar la sesión de cualquier usuario anterior mediante progtwigció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 inicio de este método para cerrar la sesión de cualquier usuario anterior.

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 use SessionTracker. Es una clase interna (paquete privado) y no debe consumirse como parte de la API pública. Como tal, su API puede cambiar en cualquier momento sin garantías 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 la aplicación.

Este método te ayudará a desconectarte de 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 } } 

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

 LoginManager.getInstance().logOut(); 

Aquí hay un fragmento que me permitió desconectarme programáticamente de Facebook. Avíseme si ve algo que necesite 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(); } 

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

 LoginManager.getInstance().logOut(); 

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

Para cerrar la sesión por completo, debe revocar los permisos y luego llamar a LoginManager.getInstance().logOut(); . Para revocar permisos, ejecuta 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(); 

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

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

Como dice la referencia Actualización a SDK 4.0 :

Sesión eliminada : las clases AccessToken, LoginManager y CallbackManager reemplazan y reemplazan la funcionalidad en la clase Session.

Sí, como se ha eliminado @luizfelippe La clase de sesión se ha eliminado desde SDK 4.0. Necesitamos usar LoginManager.

Acabo de examinar la clase LoginButton para desconectarme . Están haciendo este tipo de control. Se desconectan solo si accessToken no es nulo. Por lo tanto, creo que es mejor tener esto en nuestro código también ..

 AccessToken accessToken = AccessToken.getCurrentAccessToken(); if(accessToken != null){ LoginManager.getInstance().logOut(); } 
 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(); } } 

Facebook proporciona dos formas de iniciar sesión 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 completa el inicio de sesión. Por otro lado, LoginManager lo hace por sí mismo. En su caso, usted ha usado LoginManager para cerrar la sesión automáticamente.

LoginManager.getInstance().logout() funciona para usted.