1

我可以登录到我的应用程序然后分享一些东西。这需要一个 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 应该出现时它仍然是 OPENING 。

请帮忙。

4

3 回答 3

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()

于 2014-04-17T10:57:10.640 回答
2

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

于 2013-09-03T18:32:47.073 回答
0

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

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

这对我有用。

于 2015-02-15T05:09:09.113 回答