80

标题说明了一切。我正在使用自定义按钮来获取用户的 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 );
              }
            });
    }
}

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

4

9 回答 9

161

最新 SDK 更新:

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

LoginManager.getInstance().logOut();

原答案:

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

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

于 2013-01-14T23:05:06.760 回答
87

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

    }

}
于 2013-09-03T05:41:53.083 回答
66

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

LoginManager.getInstance().logOut();
于 2015-03-31T16:00:52.157 回答
27

这是允许我以编程方式从 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();
}
于 2013-03-20T06:26:47.627 回答
14

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

LoginManager.getInstance().logOut();

这还不够。这将简单地清除缓存的访问令牌和配置文件,以便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();
于 2015-08-09T10:39:51.790 回答
8

SDK 4.0 中删除了会话类。登录管理是通过类LoginManager完成的。所以:

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

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

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

于 2015-04-29T20:43:17.480 回答
3

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

我只是查看了LoginButton类以进行注销。他们正在做这种检查。他们仅在accessToken不为空时注销。所以,我认为在我们的代码中也有这个更好..

AccessToken accessToken = AccessToken.getCurrentAccessToken();
if(accessToken != null){
    LoginManager.getInstance().logOut();
}
于 2015-07-02T21:21:11.610 回答
0
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();    
}
}
于 2014-08-22T10:01:51.590 回答
0

Facebook 提供了两种登录和注销帐户的方法。一种是使用LoginButton,另一种是使用LoginManager。LoginButton 只是一个按钮,点击后就完成了登录。另一方面,LoginManager 会自行执行此操作。在您的情况下,您已经使用 LoginManager 自动注销。

LoginManager.getInstance().logout()这对你有用吗?

于 2016-06-22T12:28:59.803 回答