Session.getActiveSession() returns null when start

2019-04-23 13:43发布

问题:

I use com.facebook.widget.UserSettingsFragment to manage login/logout to Facebook in my app:

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");

In another Fragment (but same Activity), Before publishing on Facebook I'm checking whether I'm logged using

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

When I start my app and try to publish, I always get a null Session although I logged in before. And when I start UserSettingsFragment, it shows me that I'm connected.

How can Session.getActiveSession(); be null if I'm actually connected?

Moreover, if I I start the Fragment where I do the publishing straight after UserSettingsFragment, I get the correct Session, i.e.:

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

but

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

Anybody can help?

回答1:

Ok, I've just read about openActiveSessionFromCache (not from Facebook doc though):

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();
}


回答2:

Jul's answer does not work for me. So I tried this:

If you had loggedin earlier and if you restarted the app then the session may not be null and it could be in the CREATED_TOKEN_LOADED state. This state implies that the Session has not yet been opened and has a cached token. Opening a Session in this state will not involve user interaction. To open the session from this state you can call the method session.openForRead(null). This immediately opens the session without any user interaction.

So check for this add the following code:

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();
}