使用上次会话的Android facebook sdk 3.0.1

时间:2013-04-24 09:55:45

标签: android facebook-android-sdk

我在facebook sdk 3.0.1中有以下场景。当用户首次登录并选择“FB登录”然后SSO启动时,新会话打开,一切正常。但是,当用户关闭应用程序并再次启动时 - 我不明白如何获得最后一次打开会话,目前我正在打开一个新会话,用户再次看到FB进度条(当它连接到再次FB,即使用户已经在他的最后一次运行中批准了FB)。有人知道如何跳过这个操作吗?

编辑1:

这是我检索会话的方式:

public void tryRetrievFacebookSession() {
    Session session = Session.getActiveSession();

    if (session != null && session.isOpened())
        return;

    session = Session.openActiveSession(this, true, new Session.StatusCallback() {

        @Override
        public void call(Session session, SessionState state, Exception exception) {
            MobliLog.d("SplashScreen", "Inside call() with session with state: " + session.getState());
            // onSessionStateChanged(session, state, exception);
        }
    });

}

 @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session session = Session.getActiveSession();

    if (session != null)
        session.onActivityResult(this, requestCode, resultCode, data);

    uiHelper.onActivityResult(requestCode, resultCode, data);

}

通常会创建会话,或者从LoginButton或使用这些行创建会话:

session = Session.getActiveSession();

    if (session.getState().isClosed())
        session = new Session(this);

    if (session.isOpened()) {
        onAuthenticationEndListener.onSuccessfullAuthentication();
        return;
    } else {
        this.onFacebookAuthenticationEndListener = onAuthenticationEndListener;
        Session.setActiveSession(session);
        session.openForRead(new Session.OpenRequest(SocNetwksCompatScreen.this).setCallback(null));
        return;
    }

信息1:

当我在做第一个Session session = Session.getActiveSession();在sso身份验证后的登录中,我的会话状态为CLOSED而不是OPENED

资讯2: 我正在使用uiHelper并将其初始化为:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    twitter = SocialPluginsUtils.getTwitterClient();

    uiHelper = new UiLifecycleHelper(this, statusCallback); 
    uiHelper.onCreate(savedInstanceState);
}

现在,我知道在执行Session.getActiveSession()之后;会话状态应该打开并在OPEN之后,然后应该调用uiHelper的回调。在我的代码中,状态是CLOSED或CLOSED_LOGIN_FAILED或CREATED(不确定为什么它不稳定),其余部分不会发生

3 个答案:

答案 0 :(得分:2)

事实上,每次用户关闭应用程序时,会话都会关闭 因此,如果Session.getActiveSession()返回空会话,则只需要调用Session.openActiveSession(activity, true, sessionCallback)

如果存在有效的令牌缓存,则此方法将使用它来打开新会话,而无需用户插入任何数据。否则,这将显示具有基本权限的默认对话框。

答案 1 :(得分:0)

编辑后我可以看到问题可能与您管理会话的方式有关。 我在我的项目中使用此代码:

    Session session = Session.getActiveSession();

    if (session == null){
        Session.openActiveSession(activity, true, sessionCallback);
    }

    else if (!session.getState().isOpened()){
        session.openForRead(new Session.OpenRequest(activity)
                .setCallback(sessionCallback));
                    //this will open the session with basic read permissions
    }

    else {          
        //do what you want with the opened session
    } 

此外,如果你使用UiLifecycleHelper,你不需要我在评论中建议的两行代码,它们已经在帮助器的方法中了。但是你必须确保在活动的每个相关方法中调用助手的所有方法(onResume,onPause等)。

如果没有令牌缓存,openActiveSession(activity, true, sessionCallback)将自动调用新对话框,如果用户成功登录,则新的令牌缓存将可供将来使用。

答案 2 :(得分:0)

问题解决了。我不小心打电话给session.closeAndClearTokenInformation();在onStop()(是的,这么愚蠢!)