2012-12-14 51 views
18

我想使用Facebook SDK 3.0檢索按鈕上的訪問令牌按我的Android應用程序。我在我的活動,是做一個通用按鈕如下:Android的Facebook SDK3.0,會話狀態開放

Button facebook = (Button)findViewById(R.id.facebookLoginButton); 
    facebook.setOnClickListener(new OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Session session = new Session(getApplicationContext()); 
      Session.setActiveSession(session); 
      session.openForRead(new Session.OpenRequest(SignInActivity.this).setCallback(statusCallback)); 
     } 
    }); 

然後回調:

private class FacebookSessionStatusCallback implements Session.StatusCallback { 
    @Override 
    public void call(Session session, SessionState state, Exception exception) { 
      String s=session.getAccessToken(); 
    } 
} 

點擊該按鈕會提示我要我的權限來訪問我的個人資料如預期,但該只有SessionState被稱爲「OPENING」纔會調用回調函數。之後這個狀態不會改變。

我在這裏錯過了什麼?我的最終目標實際上只是一次獲取訪問令牌,而我並不在乎持久會話或使用它登錄到我的應用程序。

回答

69

您需要重寫onActivityResult,以便在針對Android的Facebook(或內聯登錄)檢查憑據後,處理結果並更新會話。添加以下代碼:

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

這是一個快速修復,謝謝!快速跟進問題 - 如何設置requestCode以便我可以檢查它是否來自Facebook或不在onActivityResult? –

+0

請參閱https://developers.facebook.com/docs/reference/android/3.0/Session.OpenRequest,但您可以這樣做:session.openForRead(new Session.OpenRequest(SignInActivity.this).setCallback(statusCallback).setRequestCode (200));然後在這個例子中檢查代碼200。 –

+0

@CAbernathy:保存了我的一天... +1。 – Anukool

1

@Lucas Jota:嘗試更改請求代碼。這對我有用。 session.openForRead(new Session.OpenRequest(LoginActivity.this).setCallback(statusCallback).setRequestCode(urRequestCode)); 另外,請確保您的活動沒有「單一實例」屬性。

+1

感謝您的提醒「確保您的活動沒有」單實例「屬性,我嘗試使用單例類,結果第二次登錄時,onActivityResult未被調用。 –

+0

@Yu Lu Your評論是生命拯救者..我做的一切都正確,但仍然有問題。在我的清單中,我設置了noHistory =「true」導致問題。 – AB1209