Facebook会话状态OPENING

时间:2013-09-03 18:28:48

标签: android facebook

我可以登录我的应用程序然后分享一些东西。这需要一个OPENED会话状态。但是,当我没有登录时,我想分享一些东西,我需要打开会话。我正在使用ViewPager,例如当我从一个页面转到另一个页面时此代码

Session.openActiveSession(getActivity(), true, new StatusCallback() {
       @Override
       public void call(Session session, SessionState state, Exception exception) {
       }
});

在代码的开头,然后会话变为活动状态,我自动登录,这是错误的!这就是为什么我把这个代码块放到onClickListener中,所以我只想在我点击应用程序中的分享按钮时打开会话:

if (session != null && session.isOpened()) {
  publishFeedDialog();
}
else {
   Session.openActiveSession(getActivity(), true, new StatusCallback() {
        @Override
        public void call(Session session, SessionState state, Exception exception) {
        }
    });
   publishFeedDialog();
}

private void publishFeedDialog() {
  session = Session.getActiveSession();
  Log.i("TAG", session.getState() + ""); //OPENING


  WebDialog feedDialog = (
                    new WebDialog.FeedDialogBuilder(getActivity(),
                        Session.getActiveSession(),
                        params))
                    .setOnCompleteListener(new OnCompleteListener() {

                        @Override
                        public void onComplete(Bundle values,
                            FacebookException error) {
                             if (error == null) {
                                    final String postId = values.getString("post_id");
                                    if (postId != null) {
                                    } else {
                                        // User clicked the Cancel button
                                    }
                                } else if (error instanceof FacebookOperationCanceledException) {
                                } else {
                                    // Generic, ex: network error
                                }
                        }

                    })
                    .build();
                feedDialog.show();
}

错误:

  

尝试使用未打开的会话。

所以我徒劳地打开会话,因为当WebDialog应该出现时它仍然处于打开状态。

请帮忙。

3 个答案:

答案 0 :(得分:5)

对我而言,它的工作原理如下:

        if (Session.getActiveSession() != null && Session.getActiveSession().isOpened()) {
              publishFeedDialog();
            }
        else {

            Session session = Session.getActiveSession();
            if (!session.isOpened() && !session.isClosed()) {

                //          List<String> permissions = new ArrayList<String>();
                //            permissions.add("email");

                session.openForRead(new Session.OpenRequest(this)
                //                .setPermissions(permissions)
                .setCallback(mFacebookCallback));
            } else {
                Session.openActiveSession(getActivity(), true, mFacebookCallback);
            }
        }`

回调是

private Session.StatusCallback mFacebookCallback = new Session.StatusCallback() {
    @Override
    public void
    call(final Session session, final SessionState state, final Exception exception) {

        if (state.isOpened()) {
            String facebookToken = session.getAccessToken();
            Log.i("MainActivityFaceBook", facebookToken);
            Request.newMeRequest(session, new Request.GraphUserCallback() {

                @Override
                public void onCompleted(GraphUser user,
                        com.facebook.Response response) {
                    publishFeedDialog();
                }
            }).executeAsync();
            Prefs.setStringProperty(getActivity(), R.string.key_prefs_facebook_token, facebookToken);
        }
    }
};

尝试在CallBack onCompleted

中调用publishFeedDialog()

答案 1 :(得分:2)

在检查会话状态后尝试从call()内部调用publishFeedDialog()(不要使用session.isOpened(),而是使用state.isOpened())。检查状态可确保您的会话处于打开状态,并且还可用于执行请求。可以多次调用StatusCallback,直到Session实际打开为止,这就是为什么你应该在发送任何请求之前检查状态。

答案 2 :(得分:0)

如果要从片段打开会话,请使用下一个openActiveSession方法实现。

openActiveSession(Context context, Fragment fragment, boolean allowLoginUI, Session.StatusCallback callback)

这适合我。