FB sdk,requestNewPublishPermissions()不会调用任何回调

时间:2013-10-14 10:41:27

标签: android permissions callback facebook-android-sdk

我一步一步跟着FB tutorial,我无法弄清楚为什么这不起作用。

我的所有片段都继承自 BaseFragment

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
    }
    ...
}

最后我有一个 NewsFragment ,其中包含Feed的listView。每个饲料都是可共享的。 当我们点击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

3 个答案:

答案 0 :(得分:3)

我终于弄明白了。 正如许多人所说,这是一个onActivityResult()问题,但非常恶毒。

登录时,FacebookLoginFragment.onSessionStateChange()被成功调用,而NewsFragment.onSessionStateChange()在持续过程中从未被调用过。

经过多次测试,我认为这是由于静态和动态绑定造成的。我的FacebookLoginfragment是在xml(静态)中直接引用的,而我的NewsFragment是在源代码中动态添加的。 因此,包含两个片段的Activity仅将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);
} 

答案 1 :(得分:1)

是的,回调和新权限请求确实似乎仍然存在错误。

作为临时工作,您可以致电:

session.addCallback(yourCallback);

在你调用session.requestNewPublishPermissions之前。

请注意,此回调现在将接收会话中所有未来的状态更改。如果这不是您想要的,您可以在发布后始终调用session.removeCallback(yourCallback)。

答案 2 :(得分:0)

即使您按照Ming所说的那样添加回调,也可能会出现问题。

请参阅此错误:https://developers.facebook.com/bugs/130681460449340

在评论中看起来有一个建议的解决方案/解决方法。