2

Итак, у меня есть Dialog с кнопкой «share». Когда кнопка нажата, вызывается метод, который делится информацией о пользователях, если они уже вошли в Facebook. Однако, если они не вошли в Facebook, я бы сначала попросил пользователя войти в систему и затем поделиться своей информацией. Вот моя попытка входа пользователя в без LoginButton:Правильный способ создать сеанс Facebook для входа?

Session.OpenRequest openRequest = new Session.OpenRequest(GameActivity.this); 
        StatusCallback callback = new StatusCallback(){ 

         @Override 
         public void call(Session session, SessionState state, Exception exception) { 
          Log.d(TAG, "CALL"); 
          if (Session.getActiveSession() != null && Session.getActiveSession().isOpened()){ 
           Log.d(TAG, "sendBrag was called"); 
           sendBrag(); 
          }else{ 
           Log.d(TAG, "session is not opened"); 
          } 
          if (exception != null){ 
           Log.d(TAG, "caught exception in call method"); 
          } 
         } 
        }; 
        openRequest.setCallback(callback); 
        openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS); 
        openRequest.setPermissions(PERMISSIONS); 
        Session session = new Session(GameActivity.this); 
        session.openForPublish(openRequest); 
        Session.setActiveSession(session); 

Где PERMISSIONS является:

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 

Проблема заключается в том, что никогда не входит в систему! Я либо получаю сообщение Toast с сообщением «проверьте сетевое подключение» (хотя мое сетевое соединение в порядке), или ничего не происходит. Но из журналов я могу сказать, что сессия никогда не открывается. Подводя итог: Как правильно войти в Facebook, используя класс Session? Что мне здесь не хватает? Любая помощь, предложения или советы будут очень благодарны, спасибо!

ответ

4

Я нашел решение проблемы, которую я имел от SessionLoginSample, находящейся в папке с образцами в пределах Facebook SDK. Во-первых, в рамках onCreate метода в моей деятельности я поставил следующий код:

Session session = Session.getActiveSession(); 
    if (session == null) { 
     if (savedInstanceState != null) { 
      session = Session.restoreSession(this, null, statusCallback, savedInstanceState); 
     } 
     if (session == null) { 
      session = new Session(this); 
     } 
     Session.setActiveSession(session); 
     if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) { 
      session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
     } 
    } 

Где statusCallback является:

private Session.StatusCallback statusCallback = new SessionStatusCallback(); 

И SessionStatusCallback внутренний класс в моей деятельности:

private class SessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
     if (session.isOpened() && session != null){ 
      sendBrag(); 
     } 
    } 
}//end of SessionStatusCallback class 

Затем я создал метод, который обрабатывает запись в Facebook, если пользователь еще не вошёл в систему:

private void onClickLogin() { 
    Session session = Session.getActiveSession(); 
    if (!session.isOpened() && !session.isClosed()) { 
     session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
    } else { 
     Session.openActiveSession(this, true, statusCallback); 
    } 
}//end of onClickLogin() method 

Который я позвонил из кнопки «Поделиться». И, наконец, то, что я считаю самой важной частью кода (я считаю, что это может быть там, где я побежал за ошибки до того, так как я не имел это в моем коде), является onActivityResult() метод:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data); 
}//end of onActivityResult() method 

И все это на самом деле для него. Хотя, я не знаю, почему он полностью работал, так как я использовал метод openForRead вместо openForPublish, но он, похоже, сработал. Надеюсь, это окажется полезным для кого-то, застрявшего с той же проблемой, с которой я застрял.