如何以编程方式从Facebook SDK 3.0注销而不使用Facebooklogin/注销button?

标题说明了一切。 我正在使用自定义button来获取用户的Facebook信息(用于“注册”目的)。 然而,我不希望应用程序记住最后一个注册用户,既不是通过Facebook本地应用程序login的人。 我希望每次都能popupFacebooklogin活动。 这就是为什么我想以编程方式注销任何以前的用户。

我怎样才能做到这一点? 这是我如何做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 ); } }); } } 

理想情况下,我会在此方法开始时拨打电话以注销任何以前的用户。

更新最新的SDK:

现在@ zeuter的答案对于Facebook SDK v4.7 +是正确的:

LoginManager.getInstance().logOut();

原始答案:

请不要使用SessionTracker。 它是一个内部(包私有)类,并不意味着作为公共API的一部分被使用。 因此,其API可能在任何时候都没有任何向后兼容保证而改变。 你应该能够在你的代码中摆脱SessionTracker的所有实例,而只是使用活动会话。

要回答您的问题,如果您不想保留任何会话数据,只需在closures应用程序时调用closeAndClearTokenInformation即可。

这个方法将帮助你在Android中以编程方式注销Facebook

 /** * 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 } } 

由于Facebook的Android SDK v4.0(请参阅更新日志 ),您需要执行以下操作:

 LoginManager.getInstance().logOut(); 

这里是允许我从Facebook以编程方式注销的代码段。 如果您发现任何可能需要改进的地方,请告诉我。

 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(); } 

由于Facebook的Android SDK v4.0,您需要执行以下操作:

 LoginManager.getInstance().logOut(); 

这是不够的。 这将简单地清除caching的访问令牌和configuration文件,以便AccessToken.getCurrentAccessToken()Profile.getCurrentProfile()现在将变为空。

要彻底注销,您需要撤销权限,然后调用LoginManager.getInstance().logOut(); 。 撤销以下图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(); 

会话类已在SDK 4.0上删除。 login操作是通过LoginManager完成的 。 所以:

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

作为参考升级到SDK 4.0说:

会话已删除 – AccessToken,LoginManager和CallbackManager类取代和replaceSession类中的function。

是的,作为@luizfelippe提到会话类已被删除,因为SDK 4.0。 我们需要使用LoginManager。

我只是看着LoginButton类的注销。 他们正在做这种检查。 只有当accessToken不为null时,它们才会注销 。 所以,我认为在我们的代码中也有这个更好。

 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提供了两种login和注销帐户的方式。 一个是使用LoginButton,另一个是使用LoginManager。 LoginButton只是一个button,点击,login完成。 另一方面,LoginManager自己做这件事。 在你的情况下,你已经使用LoginManager来自动注销。

LoginManager.getInstance().logout()为你工作。