我在Android应用程序中实现了Facebook SDK。我正在使用SDK的登录功能。我想做的是以下几点:
当我的应用程序启动时,它会启动MainActivity。我的onCreate()
方法如下所示:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
this.app = (ApplicationClass)getApplicationContext();
app.setUiHelper(new UiLifecycleHelper(this, callback));
uiHelper = app.getUiHelper();
uiHelper.onCreate(savedInstanceState);
if(this.app.getLoggedIn()) {
setContentView(R.layout.login);
startLoggingIn(); // <-- Makes login button invisible and starts spinner
login();
} else {
setContentView(R.layout.login);
}
}
ApplicationClass
是一个类,我在其中设置可在整个应用程序生命周期中使用的所有类型的信息。这并不重要,但我认为我将其包含在示例中。
因此,当MainActivity启动时,它应该调用login()
方法,如下所示:
public void login() {
logging_in = true;
Log.i(TAG, "Loggin in");
synchronized (this) {
// start Facebook Login
Session.openActiveSession(this, true, new Session.StatusCallback() {
// callback when session changes state
@Override
public void call(Session session, SessionState state, Exception exception) {
if (Session.getActiveSession().isOpened()) {
// make request to the /me API
Request.executeMeRequestAsync(session, new Request.GraphUserCallback() {
// callback after Graph API response with user object
@Override
public void onCompleted(GraphUser user, Response response) {
if (user != null) { // User is logged in
app.setUser(user);
app.setLoggedIn(true);
// Redirect user to the HomeActivity
Intent intent = new Intent(getBaseContext(), HomeActivity.class);
startActivity(intent);
}
}
});
}
}
});
logging_in = false;
}
}
最后,我对Facebook会话的回调看起来像这样:
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
synchronized (this) {
if( ! logging_in ) {
login();
}
}
} else if (state.isClosed()) {
setContentView(R.layout.login);
}
}
它做得很好,除了多次调用login()
方法。我日志中的输出是:
为什么这么多次被调用?它显然确保HomeActivity
意图多次启动。我无法弄清楚原因。
解决方案
稍微改变了我的Session.StateCallback。它现在看起来像这样:
private void onSessionStateChange(Session session, SessionState state, Exception exception) {
if (state.isOpened()) {
if(state == SessionState.OPENED_TOKEN_UPDATED) {
Log.i(TAG, "OPENED_TOKEN_UPDATED");
login();
} else if (state == SessionState.OPENED) {
if(app.getUser() != null) {
// Redirect user to the HomeActivity
Intent intent = new Intent(getBaseContext(), HomeActivity.class);
startActivity(intent);
} else {
login();
}
}
} else if (state.isClosed()) {
if(state == SessionState.CLOSED_LOGIN_FAILED) {
Log.i(TAG, "CLOSED_LOGIN_FAILED");
setContentView(R.layout.login);
} else if(state == SessionState.CLOSED) {
Log.i(TAG, "CLOSED");
//setContentView(R.layout.login);
}
}
}
答案 0 :(得分:2)
最有可能的原因是你从onSessionState调用登录名更改了。
当您登录会话时会发生什么事情时,它会改变正确的方式。 当它改变时,调用onSessionState更改并调用login。
我希望无限循环,但似乎Facebook已为此做了一些处理。
答案 1 :(得分:1)
我也遇到了同样的问题..我刚刚更改了我的活动结果代码。它工作..