Facebook Android SDK会话openForPublish没有创建新会话

时间:2013-04-05 18:22:52

标签: android facebook facebook-graph-api facebook-android-sdk

我在Facebook Android SDK中打电话

Session tempSession = new Builder(this).build();
Session.setActiveSession(tempSession);
tempSession.openForRead(new OpenRequest(this).setPermissions(FB_PERMISSIONS));

它获得了FB会话,并且每件事都正常运行。但是当我用Read替换Publish时。即遵循

Session tempSession = new Builder(this).build();
Session.setActiveSession(tempSession);
tempSession.openForPublish(new OpenRequest(this).setPermissions(FB_PERMISSIONS));

它提示错误说会话为空,并且无法获得空会话的发布权限。

你能告诉我为什么会这样,最好的办法是什么?

2 个答案:

答案 0 :(得分:7)

我花了一段时间对其进行排序,以便用户可以点击按钮在Feed中共享我在Facebook上的某个产品。我不希望在他们真正想分享之前提示他们登录,所以我真的只是想要发布权限。以下内容将初始登录/读取权限请求与发布权限请求进行堆叠。这将双重提示用户,首先进行读取,然后进行发布,但无论解决方案如何,现在都需要提示:

Session session = Session.getActiveSession();

if (session == null) {
    session = new Session.Builder(this).setApplicationId("<APP ID HERE>").build();

    Session.setActiveSession(session);
    session.addCallback(new StatusCallback() {
        public void call(Session session, SessionState state, Exception exception) {
            if (state == SessionState.OPENED) {
                Session.OpenRequest openRequest = new Session.OpenRequest(FacebookActivity.this);
                openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
                session.requestNewPublishPermissions(
                        new Session.NewPermissionsRequest(FacebookActivity.this, PERMISSIONS));
            }
            else if (state == SessionState.OPENED_TOKEN_UPDATED) {
                publishSomething();
            }
            else if (state == SessionState.CLOSED_LOGIN_FAILED) {
                session.closeAndClearTokenInformation();
                // Possibly finish the activity
            }
            else if (state == SessionState.CLOSED) {
                session.close();
                // Possibly finish the activity
            }
        }});
}

if (!session.isOpened()) {
    Session.OpenRequest openRequest = new Session.OpenRequest(this);
    openRequest.setLoginBehavior(SessionLoginBehavior.SSO_WITH_FALLBACK);
    session.openForRead(openRequest);
}
else
    publishSomething();

答案 1 :(得分:4)

简短的回答是,不要调用openForPublish。如果需要发布权限,请调用openForRead,然后再调用requestNewPublishPermissions。

答案很长,你不能申请发布权限(通过你的应用程序之前从未与Facebook连接的用户),除非你已经拥有基本权限或默认权限(如果你调用openForRead,你会得到什么许可集)。因此openForPublish实际上处理了大多数应用程序可能没有的特定利基用例。