我是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会话为空。
答案 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,暗示他们不希望开发人员使用它) - - 但您可以根据需要调整代码。