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

在我调用的Facebook Android SDK中

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

它得到一个FB会话,每件事都正常运行。 但是当我用Publish替换Read时。 即如下

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

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

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

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

答案很长,您不能通过您的应用程序请求发布权限(在通过您的应用程序之前从未与Facebook连接的用户),除非您已经拥有基本或默认权限(如果您使用空权限集调用openForRead将获得什么) 。 因此openForPublish实际上处理了大多数应用程序可能没有的非常具体的利基用例。

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

 Session session = Session.getActiveSession(); if (session == null) { session = new Session.Builder(this).setApplicationId("").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();