2013-03-25 85 views
2

我正在嘗試在我的應用中使用Facebook認證,但我無法登錄,因爲令牌丟失。在LogCat中我有一個循環:「[Tag] System.out [Text] doLogin:」。 這發生在Facebook對話框之前,當它出現時,我點擊「確定」但沒有任何反應。Facebook SDK 3.0 Android - 令牌缺失

這裏是我的代碼:

private SharedPreferences.Editor loginPrefsEditor; 
private Session.StatusCallback statusCallback = new SessionStatusCallback(); 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_fb_auth); 
    choosePseudoButton = (Button) findViewById(R.id.buttonChoosePseudoFb); 
    progressBarFb = (ProgressBar) findViewById(R.id.progressBarFbLoad); 
    textViewFbInfo = (TextView) findViewById(R.id.currentInfoFb); 
    editTextFbPseudo = (EditText) findViewById(R.id.editTextPseudoFb); 
    /* 
    * Get existing access_token if any 
    */ 
    mPrefs = getPreferences(MODE_PRIVATE); 

    // start Facebook Login 
    Session.openActiveSession(this, true, new Session.StatusCallback() { 
     public void call(final Session session, SessionState state, Exception exception) { 
      if (session.isOpened()) { 
       Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 
        public void onCompleted(GraphUser user, Response response) { 
         if (user != null) { 
          System.out.println("onCreate"); 
          fbToken = session.getAccessToken(); 
          SharedPreferences.Editor editor = mPrefs.edit(); 
          editor.putString("access_token", fbToken); 
          JSONRequest jr = (JSONRequest) new JSONRequest().execute(); 

         } 
        } 
       }); 
      } 
      else { 
       doLogin(); 
      } 
     } 
    }); 
} 

private void doLogin() { 
    Session session = Session.getActiveSession(); 
    if (!session.isOpened() && !session.isClosed()) { 
     session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback)); 
    } else { 
     Session.openActiveSession(this, true, statusCallback); 
    } 
    fbToken = session.getAccessToken(); 
    System.out.println("doLogin: "+fbToken); 
    JSONRequest jr = (JSONRequest) new JSONRequest().execute(); 
} 


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

private void updateView() { 
    Session session = Session.getActiveSession(); 
    if (session.isOpened()) { 
     fbToken = session.getAccessToken(); 
     System.out.println("updateView: "+fbToken); 
     JSONRequest jr = (JSONRequest) new JSONRequest().execute(); 
    } 
    else { 
     doLogin(); 
    } 
} 

private class SessionStatusCallback implements Session.StatusCallback { 
    public void call(Session session, SessionState state, Exception exception) { 
     // Respond to session state changes, ex: updating the view 
     if(session.isOpened()){ 
      Request.executeMeRequestAsync(session, new Request.GraphUserCallback() { 

       public void onCompleted(GraphUser user, Response response) { 
       } 
      }); 
     } 
     updateView(); 
    } 
} 

回答

1

有幾件事情需要注意:

會議開幕異步發生,也就是說,當你調用Session.openActiveSession,它不(總是)立即打開會話(它必須調用另一個活動,等待用戶輸入等)。所以你的線路

fbToken = session.getAccessToken(); 

將幾乎總是返回null。其次,有一些Session可以在它進入OPENED狀態之前處於狀態,所以在你的SessionStatusCallback中,你應該把updateView()調用放在if(session.isOpened())中。檢查。

最後,您在onCreate方法中調用Session.openActiveSession,並且在該回調中,如果會話未打開,則始終調用doLogin()。但正如我之前所說的,會話可以在OPENED之前轉換到多個狀態,所以實際上多次調用doLogin。刪除doLogin()調用。