1

我是 Facebook SDK (3) 的新手,并且已成功编译并运行 HelloFacebookSample。现在我只想发布一个墙贴,所以我试图删除所有不必要的东西,只有发布状态功能

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    postStatusUpdateButton = (Button) findViewById(R.id.postStatusUpdateButton);
    postStatusUpdateButton.setOnClickListener(new View.OnClickListener() {
        public void onClick(View view) {
            onClickPostStatusUpdate();
        }
    });
}

private void onClickPostStatusUpdate() {
    performPublish(PendingAction.POST_STATUS_UPDATE);
}

private void performPublish(PendingAction action) {
    Session session = Session.getActiveSession();
    if (session != null) {
        pendingAction = action;
        if (hasPublishPermission()) {
            // We can do the action right away.
            handlePendingAction();
        } else {
            // We need to reauthorize, then complete the action when we get called back.
             Session.ReauthorizeRequest reauthRequest = new Session.ReauthorizeRequest(this, PERMISSIONS).
                        setRequestCode(REAUTHORIZE_ACTIVITY).
                        setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
            session.reauthorizeForPublish(reauthRequest);
        }
    }
}

但是在 performPublish 会话上为空。

4

1 回答 1

1

我自己遇到了这个问题。Session 为空,因为用户未登录;用户必须在调用 reauthorizeRequest 或发送请求之前登录。

一种方法是确保用户单击 LoginButton 并成功登录;如果他们在尝试发布状态更新时没有登录(会话为空),那么您应该显示一个 AlertDialog 告诉他们登录——或者更好的是,打开登录对话框。

LoginButton 是一个很好的便利工具,但不幸的是,Facebook 只是让您选择完全按原样使用 LoginButton 或从头开始编写所有内容。但是在 Eclipse 中打开 LoginButton 可以看到重要的代码:

Session currentSession = sessionTracker.getSession();
                if (currentSession == null || currentSession.getState().isClosed()) {
                    sessionTracker.setSession(null);
                    Session session = new Session.Builder(context).setApplicationId(applicationId).build();
                    Session.setActiveSession(session);
                    currentSession = session;
                }
                if (!currentSession.isOpened()) {
                    Session.OpenRequest openRequest = null;
                    if (parentFragment != null) {
                        openRequest = new Session.OpenRequest(parentFragment);
                    } else if (context instanceof Activity) {
                        openRequest = new Session.OpenRequest((Activity)context);
                    }

                    if (openRequest != null) {
                        openRequest.setPermissions(permissions);
                        openRequest.setLoginBehavior(loginBehavior);

                        if (SessionAuthorizationType.PUBLISH.equals(authorizationType)) {
                            currentSession.openForPublish(openRequest);
                        } else {
                            currentSession.openForRead(openRequest);
                        }
                    }
                }

这是登录代码(即调出登录屏幕以便用户登录)。您可以自己使用 SessionTracker,但我认为 Facebook 可能并不意味着人们使用它(它不在 SDK 文档中,并且包是 com.facebook.internal,暗示他们不希望开发人员使用它)- - 但您可以根据需要调整代码。

于 2012-12-05T17:54:19.113 回答