我使用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
有人可以帮忙吗?
答案 0 :(得分:34)
好的,我刚读过openActiveSessionFromCache
(不是来自Facebook doc):
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();
}
答案 1 :(得分:0)
7月的answer对我不起作用。所以我尝试了这个:
如果您之前已登录并且重新启动了应用程序,则会话可能不会为空,并且可能处于CREATED_TOKEN_LOADED状态。此状态表示会话尚未打开并具有缓存的令牌。在此状态下打开会话不会涉及用户交互。要从此状态打开会话,可以调用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();
}