2013-04-22 64 views
2

所以,我有一個Dialog與「共享」按鈕。當按鈕被按下時,它會調用一個共享用戶信息的方法,如果他們已經登錄到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消息,指出「檢查您的網絡連接」(即使我的網絡連接正常),或者沒有任何反應。但從日誌中我可以告訴Session永遠不會打開。 綜上所述:您如何使用Session課程正確登錄Facebook?我在這裏錯過了什麼?任何幫助,建議或意見將不勝感激,謝謝!

回答

4

我找到了位於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,但它似乎工作。我希望這證明對有人陷入同樣的​​問題,我堅持與幫助。