2013-10-14 35 views
1

我跟着FB tutorial一步一步,我無法弄清楚爲什麼這不起作用。FB sdk,requestNewPublishPermissions()不會調用任何回調

public class BaseFragment extends SherlockFragment { 
    ... 
    protected UiLifecycleHelper _uiHelper; 
    protected boolean _isResumed = false; 

    protected static final List<String> PERMISSIONS = Arrays.asList("publish_actions"); 
    protected static final String PENDING_PUBLISH_KEY = "pendingPublishReauthorization"; 
    protected boolean _pendingPublishReauthorization = false; 


    protected Session.StatusCallback _callback = new Session.StatusCallback() { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      onSessionStateChange(session, state, exception); 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     _uiHelper = new UiLifecycleHelper(getSherlockActivity(), _callback); 
     _uiHelper.onCreate(savedInstanceState); 
    } 

    protected void onSessionStateChange(Session session, SessionState state, Exception exception) {} 

    ...(all lifecycle stuff) 
} 

然後,我有一個FacebookLoginFragment其中包含登錄/註銷按鈕:

public class FacebookLoginFragment extends BaseFragment { 

    protected LoginButton _authButton; 
    protected ProgressBar _loadingBar; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.facebook_login, container, false); 

     _loadingBar = (ProgressBar) view.findViewById(R.id.login_progressBar); 

     _authButton = (LoginButton) view.findViewById(R.id.authFacebookButton); 
     _authButton.setFragment(this); 
     _authButton.setReadPermissions(Arrays.asList("email", "user_birthday")); 

     return view; 
    } 

    @Override 
    protected void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     super.onSessionStateChange(session, state, exception); 

     // LogIn process 
    } 
    ... 
} 

最後我有一個

我所有的碎片從BaseFragment繼承NewsFragment其中包含供稿的列表視圖。每個Feed都是可共享的。 當我們點擊Feed的分享按鈕時,適配器會調用NewsFragment.publishFeed(feed)方法。

public class NewsFragment extends BaseFragment{ 
    ... 
    protected Feed _feedPendingPublish; 

    @Override 
    // => NEVER CALLED 
    protected void onSessionStateChange(Session session, SessionState state, Exception exception) { 
     super.onSessionStateChange(session, state, exception); 

     if (_isResumed) { 

      if (_pendingPublishReauthorization && state.equals(SessionState.OPENED_TOKEN_UPDATED)) { 
       _pendingPublishReauthorization = false; 
       if(_feedPendingPublish != null){ 
        publishFeed(_feedPendingPublish); 
        _feedPendingPublish = null; 
       } 
      } 
     } 
    } 

    public void publishFeed(Feed feed){ 

     if(_pendingPublishReauthorization){ 
      return; 
     } 

     Session session = Session.getActiveSession(); 

     if (session != null){ 

      // If permission doesn't exist, ask and return. Otherwise, send request 

      List<String> permissions = session.getPermissions(); 
      if (!isSubsetOf(PERMISSIONS, permissions)) { 
       _pendingPublishReauthorization = true; 
       _feedPendingPublish = feed; 

       Session.NewPermissionsRequest newPermissionsRequest = new Session 
        .NewPermissionsRequest(getSherlockActivity(), PERMISSIONS); 
       session.requestNewPublishPermissions(newPermissionsRequest); 

       return; 
      } 

      // DO stuff 
     } 
    } 
} 

問題是NewsFragment回調沒有在發佈授權後調用。 (既不是BaseFragment,也不是FacebookLogin)。 請注意,這兩個片段都存在於相同的活動中。

我使用Facebook的Android的SDK-3.5.2

+0

嘗試增加一個回調到您newPermissionsRequest調用你NewsFragment的onSessionStateChange方法。 –

+0

我已經試過了。內部回調也不被調用。 –

回答

3

我終於明白了這一點。正如很多人所說,這是一個onActivityResult()的問題,但相當惡毒。

當登錄時,FacebookLoginFragment.onSessionStateChange()被調用成功,而NewsFragment.onSessionStateChange()在執行過程中從未被調用過。

經過多次測試,我認爲這是由於靜態和動態綁定。我的FacebookLoginfragment直接在xml(static)中引用,而我的NewsFragment是在源代碼中動態添加的。 因此,包含這兩個片段的活動只發送onActivityResult信號到FacebokLoginFragment。 因此,觸發回調所必需的NewsFragment.onActivityResult()從未被調用過。

重寫Activity.onActivityResult()給了我預期的行爲:

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    getSupportFragmentManager().findFragmentById(R.id.my_fragment_frame).onActivityResult(requestCode, resultCode, data); 
} 
0

即使你添加回調銘說,你可能會出現問題。

看到這個錯誤:https://developers.facebook.com/bugs/130681460449340

它看起來像有在評論中提出的解決方案/解決方法。

+0

我在每個Activity/Fragment中設置了onActivityResult()方法。還是行不通。我不知道該怎麼做。 –

1

是的,確實似乎仍然存在回調和新權限請求的bug。

作爲一個臨時的解決辦法,你可以撥打:

session.addCallback(yourCallback); 

打電話session.requestNewPublishPermissions之前。

請注意,此回調現在將在您的會話中接收所有未來狀態更改。如果這不是你想要的,你可以在發佈後總是調用session.removeCallback(yourCallback)。

+1

我已經試過這個。回調從未被調用。 –

+0

請注意,這是將回調直接添加到會話中,而不是新的權限請求。它不會在那裏被調用的唯一原因是如果你沒有重寫父活動中的onActivityResult方法。 –