我正在更新使用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退出。 怎么了?
答案 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();
}