Android - Facebook SDK 3 - 仅限Wall

时间:2012-12-04 20:04:02

标签: android facebook facebook-wall

我是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会话为空。

1 个答案:

答案 0 :(得分:1)

我自己遇到了这个问题。会话为空,因为用户未登录;用户必须在调用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,暗示他们不希望开发人员使用它) - - 但您可以根据需要调整代码。