8

我使用 com.facebook.widget.UserSettingsFragment 在我的应用程序中管理登录/注销 Facebook:

UserSettingsFragment userSettingsFragment = new UserSettingsFragment();
Session session = Session.getActiveSession();
if(session==null || session.isClosed()){
    userSettingsFragment.setPublishPermissions(Arrays.asList("publish_actions"));
}
fragmentTransaction.replace(R.id.content_container, userSettingsFragment, "userSettingsFragment");

在另一个Fragment(但相同Activity)中,在 Facebook 上发布之前,我正在检查我是否使用

Session session = Session.getActiveSession();
if (session != null && session.isOpened()){
    publishOnFacebook(intent.getExtras());
}

当我启动我的应用程序并尝试发布时,null Session虽然我之前登录过,但我总是得到一个。当我开始时UserSettingsFragment,它表明我已连接。

如果我真的连接了怎么Session.getActiveSession();办?null

此外,如果Fragment我在之后立即开始我进行发布的地方UserSettingsFragment,我会得到正确的Session,即:

1 start the app
2 call `Session.getActiveSession()` in another `Fragment` returns `null`
3 start `UserSettingsFragment` shows that I'm log

1 start the app
2 start `UserSettingsFragment` shows that I'm log
3 call `Session.getActiveSession()` in another `Fragment` returns a session

有人可以帮忙吗?

4

2 回答 2

33

好的,我刚刚读到openActiveSessionFromCache(不是来自 Facebook 文档):

Session session = Session.getActiveSession(); 

if(session==null){                      
    // try to restore from cache
    session = Session.openActiveSessionFromCache(getActivity());
}

if(session!=null && session.isOpened()){    
    publishOnFacebook(intent.getExtras());  
}
else{
    login();
}
于 2013-08-18T07:40:20.723 回答
0

Jul 的回答对我不起作用。所以我尝试了这个:

如果您之前登录过并且重新启动了应用程序,则会话可能不是空的,并且可能处于 CREATED_TOKEN_LOADED 状态。此状态意味着 Session 尚未打开并且具有缓存的令牌。在这种状态下打开 Session 不会涉及到用户交互。要从此状态打开会话,您可以调用方法 session.openForRead(null)。这会立即打开会话,无需任何用户交互。

所以检查这个添加以下代码:

Session session = Session.getActiveSession();
if (session != null){
    if(session.getState() == SessionState.CREATED_TOKEN_LOADED){
        //this immediately opens the session
        session.openForRead(null);
    }
    if(session.isOpened()) {
        publishOnFacebook(intent.getExtras());
    }
    else{
        //start the facebook login fragment or activity
        login();
    }
}
else{
    login();
}
于 2014-10-16T07:44:15.580 回答