Android 如何在不使用Facebook登录/注销按钮的情况下以编程方式从Facebook SDK 3.0注销?

Android 如何在不使用Facebook登录/注销按钮的情况下以编程方式从Facebook SDK 3.0注销?,android,facebook,facebook-graph-api,facebook-android-sdk,Android,Facebook,Facebook Graph Api,Facebook Android Sdk,标题说明了一切。我正在使用一个自定义按钮获取用户的facebook信息(用于“注册”目的)。然而,我不想让应用程序记住上次注册的用户,也不想记住当前通过Facebook本机应用程序登录的用户。我希望每次都弹出Facebook登录活动。这就是为什么我想以编程方式注销以前的任何用户 我该怎么做?这是我登录的方式: private void signInWithFacebook() { SessionTracker sessionTracker = new SessionTracker(ge

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

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

更新最新SDK:

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

LoginManager.getInstance().logOut()

原始答案:

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


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

以下是允许我以编程方式从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

    }

}

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

LoginManager.getInstance().logOut();
LoginManager.getInstance().logOut();

会话类已在SDK 4.0上删除。登录映像通过类LoginManager完成。因此:

mLoginManager = LoginManager.getInstance();
mLoginManager.logOut();
正如参考文献所说:

已删除会话-AccessToken、LoginManager和CallbackManager类取代并替换会话类中的功能


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

我只是查看了登录按钮类以进行注销。他们在开这种支票。只有当accessToken不为空时,它们才会注销。因此,我认为最好在我们的代码中也包含这一点

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

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

LoginManager.getInstance().logOut();
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();

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



LoginManager.getInstance().logout()
为您执行此操作。

您只需调用Session.getActiveSession,如果它返回null,则可以1.)使用Session.Builder创建新会话,然后调用Session.setActiveSession,或者2.)调用Session.openActiveSession方法之一(静态会话,为您打开并设置活动会话)。事实上,你必须打开一个会话才能注销,这表明Facebook SDK的设计有多么糟糕……与其提供一个带有标准回调的简单公共API,还不如实现一个糟糕的机制……太棒了。Facebook SDK和文档太可怜了!Facebook官方文档中包含的示例代码不推荐使用——那么我们必须这样做请参考好的旧堆栈,以便取消对其的反对。与其添加对对话没有帮助的注释,不如给出缺少文档的具体示例(与问题/答案相关),或者可以转到开发人员门户上特定文档页面的底部,单击“否”“此文档有用吗?”对于我来说,在使用片段而不是活动的情况下,这是唯一有效的解决方案!为什么代码中有else部分?如果用户未登录,为什么需要再次登录他然后注销?获取错误java.lang.NullPointerException:参数“applicationId”不能为Null我认为初始化的适当方式是se会话是new session.Builder(context.build();什么是jpotter6 mApp?任何Android应用程序库中都可以使用的应用程序类实例,但我看不到这实际上会清除会话。LoginManager.logout()只是在内部调用“AccessToken.setCurrentAccessToken(null);Profile.setCurrentProfile(null);”。我发现用户在下次启动应用程序时仍然可以登录,而无需重新输入凭据。如何强制用户重新输入凭据?此方法对我很有帮助。在调用并尝试重新登录后,出现了一个输入凭据屏幕,如预期的那样。非常感谢。@swooby指出,此解决方案非常令人遗憾y不适用于使用facebook sdk v4.x的应用注销后,AccessToken是[{AccessToken:ACCESS\u token\u REMOVED permissions:[public\u profile]}],但AccessToken.getCurrentAccessToken().getToken()返回有效的令牌字符串,即使用户不再登录或已撤销对应用程序的授权。@Lisitso您现在知道解决方案吗?@Jaec我使用了“Aniket Thakur”提供的解决方案。您可以在其他响应中找到。干杯!的答案更短,并指出相同的api调用。为什么重复?的答案更短,并指出相同的api调用。为什么重复?这是此问题的正确答案。
LoginManager.getInstance().logOut();
仅清除loca