2013-04-24 2 views
0

У меня есть следующий сценарий с facebook sdk 3.0.1. Когда пользователь сначала регистрируется и выбирает «FB login», тогда начинается SSO, открывается новый сеанс, и все работает нормально. Но тогда, когда пользователь закрывает приложение и запускает его снова - я не понимаю, как получить последний открытый сеанс, в настоящее время я открываю новый сеанс, и пользователь снова видит индикатор выполнения FB (пока он подключен к FB, даже если пользователь уже одобрил FB в своем последнем прогоне). Кто-нибудь знает, как пропустить эту операцию?Android facebook sdk 3.0.1 с использованием последнего сеанса

Edit 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.getActiveSessi на(); в логинами после аутентификации SSO, мой сеанс состояние CLOSED вместо ОТКРЫТ

информация 2: Я использую uiHelper и инициализировать его следующим образом:

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

    twitter = SocialPluginsUtils.getTwitterClient(); 

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

Теперь я знаю, что после того, как я выполняю Session.getActiveSession(); состояние сеанса должно быть ОТКРЫТО, и после этого ОТКРЫТЬ, а затем следует вызвать обратный вызов uiHelper. В моем коде состояние CLOSED или CLOSED_LOGIN_FAILED или CREATED (не уверен, почему оно не стабильно), а остальное не происходит

ответ

0

Проблема решена. Я случайно вызвал session.closeAndClearTokenInformation(); в onStop() (да, так глупо!)

+0

какой учебник вы следовали? – keen

+0

https://developers.facebook.com/docs/tutorial/iossdk/upgrading-from-2.0-to-3.1/ – Nativ

2

Фактически сеансы закрываются каждый раз, когда пользователь закрывает приложение.
Так что если Session.getActiveSession() вернуть нулевую сессию, вам нужно позвонить только Session.openActiveSession(activity, true, sessionCallback).

Если существует допустимый кэш маркера, этот метод будет использовать его для открытия нового сеанса без необходимости вставлять данные пользователю. В противном случае это будет диалог по умолчанию с основными разрешениями.

+0

Это не работает для меня, я продолжаю получать только сеанс обратного вызова с условием ОТКРЫТИЯ, а не ОТКРЫТЬ состояние – Nativ

+0

Если это проблема, вам просто нужно добавить это 'Session session = Session.getActiveSession(); если (сессия! = Null) { сессия.onActivityResult (this, requestCode, resultCode, data) ' на вашем' onActivityResult' – 5agado

+0

см. мое новое редактирование, пожалуйста, – Nativ

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) автоматически вызовет новое диалоговое окно, и если пользовательский логин с успехом новый кэш маркера будет доступен для будущего использования.

+0

Знаете ли вы, что мне нужно открыть последний сеанс из той же деятельности, из которой я открыл ее? – Nativ

+0

С вашим кодом я только что получил еще один сеанс с состоянием CREATED, и появится диалоговое окно. Я не хочу, чтобы диалог появлялся, я просто хочу извлечь этот последний сеанс. Я не могу поверить, что эта глупая задача заставляет меня так долго! глупый facebook! – Nativ

+0

Вам нужно управлять сеансом в каждом мероприятии, которое хочет отправить запрос в Facebook (см. [Мой другой ответ] (http://stackoverflow.com/questions/16055561/managing-facebook-session-in-android-app-throughout -multiple-activities-with-fac/16062629 # 16062629)) Для первого входа и для каждого времени окончания токена требуется диалоговое окно. – 5agado

Смежные вопросы