如何使用Facebook sdk 4在Android中的应用程序LogOut

时间:2015-04-08 11:10:02

标签: android facebook-login facebook-android-sdk facebook-access-token

我正在更新使用facebook sdk的应用,但我遇到了一些问题,官方文档太差了。 在我的应用程序上,用户可以使用Facebook或普通帐户(存储在我的服务器上)登录,这些选项会在应用启动时显示。显然,用户也可以注销并使用其他帐户登录(Facebook或不登录),我在登录时遇到问题。事实上,我无法注销与Facebook帐户关联的用户。 正如我在经过多次尝试后注意到的那样,所有关于facebook状态的更改都由AccessTokenTracker和ProfileTracker跟踪,应该在启动时仅实例化一次。 我展示(并解释)我的代码。 这是我的登录FragmentActivity的代码,用于检查用户是否已登录(使用facebook或专用帐户),如果是,则显示下一个活动,否则显示片段以选择访问选项:

@Override
protected void onCreate(Bundle savedInstanceState) {
    FacebookSdk.sdkInitialize(this.getApplicationContext());
    callbackManager = CallbackManager.Factory.create();

        accessTokenTracker = new AccessTokenTracker() {
            @Override
            protected void onCurrentAccessTokenChanged(AccessToken oldAccessToken, AccessToken currentAccessToken) {
                if (currentAccessToken != null) {
                    Log.i("LOGINACTIVITY", "token tracker, current token valid");
                    AccessToken token = AccessToken.getCurrentAccessToken();
                    //already logged with facebook, show next activity

                } else {
                    //check if current visible activity is logout activity
                    // that contains logout button
                    ActivityManager am = (ActivityManager) LoginActivity.this.getSystemService(ACTIVITY_SERVICE);
                    List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);

                    String top_activity = taskInfo.get(0).topActivity.getClassName();

                    if (top_activity.equals(getApplicationContext().getPackageName() + ".LogoutActivity")) {
                        //launch new login activity
                        LoginManager.getInstance().logOut();
                        getApplicationContext().startActivity(new Intent(getApplicationContext(),
                                LoginActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));

                    }

                }
            }
        };

        accessTokenTracker.startTracking();

现在它发生了,当我按下注销按钮时,accessstoken跟踪器执行其他分支,因此显示它显示的登录选项,但由于某种原因app再次自动登录facebook(如果TokenTracker的分支则调用它),因此用户不能从facebook退出。 怎么了?

1 个答案:

答案 0 :(得分:2)

确保在注销之前停止访问令牌跟踪器,以避免使用null currentAccessToken调用onCurrentAccessTokenChanged(...),这将导致 - 根据您的代码 - 执行else子句。

accessTokenTracker.stopTracking();
LoginManager.getInstance().logOut();

顺便说一句,你不必在执行新的AccessTokenTracker()之后立即使用startTracking(),因为AccessTokenTracker()实现了startTracking()

<强> AccessTokenTracker.class

public AccessTokenTracker() {
    Validate.sdkInitialized();
    this.receiver = new AccessTokenTracker.CurrentAccessTokenBroadcastReceiver();
    this.broadcastManager = LocalBroadcastManager.getInstance(FacebookSdk.getApplicationContext());
    this.startTracking();
}