如何在不使用 Facebook 登录/注销按钮的情况下程序化地从 Facebook SDK 3.0注销?

标题说明了一切。我使用一个自定义按钮来获取用户的 facebook 信息(用于“注册”目的)。然而,我不希望应用程序记住最后一个注册用户,也不希望当前通过 Facebook 本地应用程序登录的用户。我希望每次 Facebook 登录活动都能弹出来。这就是为什么我想以编程方式注销以前的用户。

我该怎么做呢? 我是这样登录的:

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

理想情况下,我会在此方法的开头调用以注销以前的所有用户。

114273 次浏览

最新的 SDK 更新:

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

LoginManager.getInstance().logOut();

原答案:

请不要使用 SessionTracker。它是一个内部(包私有)类,不应作为公共 API 的一部分使用。因此,它的 API 可能随时更改,而没有任何向后兼容性保证。您应该能够在代码中删除 SessionTracker 的所有实例,而只是使用活动会话。

要回答您的问题,如果您不想保留任何会话数据,只需在应用程序关闭时调用 CloseAndClearToken 信息

下面是允许我从 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();
}

这个方法将帮助您在 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


}


}
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 的 Android SDK v4.0(参见 更改日志) ,您需要执行以下操作:

LoginManager.getInstance().logOut();

Session 类已经在 SDK 4.0上删除。登录管理是通过类 登录管理器完成的。因此:

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

正如参考资料 升级到 SDK 4.0所说:

Session Removed -AccessToken、 LoginManager 和 CallbackManager 类取代并替换 Session 类中的功能。

是的,正如@luizfelippe 提到的,自从 SDK 4.0.以来,会议类已被删除,我们需要使用 LoginManager。

我刚查了 登录按钮类的注销信息。他们正在进行这种检查。它们只有在 Access 令牌不为空时才注销。所以,我认为最好在我们的代码中也有这个。.

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
LoginManager.getInstance().logOut();
}

从 Facebook 的 Android SDK v4.0开始,你需要执行以下操作:

LoginManager.getInstance().logOut();

这还不够。这将简单地清除缓存的访问令牌和配置文件,以便 AccessToken.getCurrentAccessToken()Profile.getCurrentProfile()现在将成为空。

要完全注销,您需要撤销权限,然后调用 LoginManager.getInstance().logOut();

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

Facebook 提供了两种登录和注销账户的方式。一种是使用 LoginButton,另一种是使用 LoginManager。LoginButton 只是一个按钮,点击它,登录就完成了。另一方面,LoginManager 自己完成这项工作。在您的情况下,您已经使用 LoginManager 自动注销。

LoginManager.getInstance().logout()为你做这个工作。