2

그래서 "share"버튼이있는 Dialog이 있습니다. 버튼을 누르면 이미 Facebook에 로그인되어있는 경우 사용자 정보를 공유하는 메소드가 호출됩니다. 그러나 Facebook에 로그인하지 않은 경우 먼저 사용자가 로그인하여 정보를 공유 할 수 있도록하고 싶습니다.로그인을 위해 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"); 

문제는 그것이 결코에 기록되지 여기에 LoginButton없이 사용자가 로그인 내 시도입니다! 나는 Toast 메시지에 "네트워크 연결 확인"(네트워크 연결 상태가 양호 함에도 불구하고) 메시지가 나타나거나 아무 반응이 없다. 그러나 로그에서 세션이 결코 열리지 않는다고 말할 수 있습니다. 모두 합하면 다음과 같습니다.Session 클래스를 사용하여 페이스 북에 어떻게 제대로 로그인합니까? 내가 여기서 무엇을 놓치고 있니? 도움, 제안 또는 조언을 주시면 대단히 감사하겠습니다.

답변

4

Facebook SDK 내의 샘플 폴더에있는 SessionLoginSample에서 발생한 문제에 대한 해결책을 찾았습니다.

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은 다음과 같습니다 : 첫째, 내 활동 내에서 onCreate 방법에서 나는 다음과 같은 코드를 삽입

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 

"공유"버튼에서 호출했습니다. 그리고 마지막으로 코드의 가장 중요한 부분이라고 생각합니다 (코드에이 코드가 없기 때문에 오류가 발생한 부분이 여기에 해당 될 수 있습니다).

그리고 그게 전부입니다. 비록 내가 openForPublish 대신에 openForRead 메쏘드를 사용했기 때문에 왜 그것이 완전히 작동했는지 모르겠다. 나는 이것이 내가 붙어 있었던 같은 문제에 갇혀있는 사람들에게 도움이되기를 희망한다.