5

我打电话时在 Facebook Android SDK 中

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

它有一个 FB 会话,一切都正常运行。但是当我替换ReadPublish. 即跟随

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

它给出了一个错误,即会话为空,并且无法获得对空会话的发布权限。

你能告诉我为什么会这样吗?处理这个问题的最佳方法是什么?

4

2 回答 2

7

我花了一些时间来解决这个问题,这样用户就可以点击一个按钮在 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();
于 2013-06-14T16:49:10.710 回答
4

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

长答案是,除非您已经拥有基本或默认权限(如果您使用空权限集调用 openForRead 会得到什么),否则您不能请求发布权限(对于之前从未通过您的应用连接过 Facebook 的用户) . 所以 openForPublish 实际上处理了大多数应用程序可能没有的非常特定的利基用例。

于 2013-04-08T20:15:12.207 回答