0

使用 Facebook SDK 创建打开请求时,出现以下错误。

错误:

引起:java.lang.UnsupportedOperationException:会话:试图打开一个已经打开的会话。在 com.facebook.Session.open(Session.java:985) 在 com.facebook.Session.openForRead(Session.java:388) 在 com.photos.pixitor.activities.PhotoEffectBaseActivity.loginRequest(PhotoEffectBaseActivity.java:619)

如果我首先提出请求,则不会发生错误。但是在先发出登录请求然后取消请求并再次主登录请求后,应用程序崩溃了。

这是代码:

OpenRequest 请求 = new Session.OpenRequest(this); request.setPermissions(Arrays.asList("basic_info"));

        if(session.isOpened()){

            session.requestNewReadPermissions(new NewPermissionsRequest(
                    PhotoEffectBaseActivity.this,"basic_info"));

            session.addCallback(new StatusCallback() {
                @Override
                public void call(Session session, SessionState state, Exception exception) {
                    if(state.isOpened()){
                        Util.logd("Opened+Publishing Request");
                        publishPhotoRequest(session);
                    }

                    if(session.isOpened()){
                        Util.logd("Session is Opened");
                        getUserDetails(session);
                    }
                }
            });

            return session;
        }

        Util.logd("Session Not Opened: Opening For Read");

        session.openForRead(request);
        Util.logd("Session is Opened for Read");

        session.addCallback(new StatusCallback() {
            @Override
            public void call(Session session, SessionState state, Exception exception) {
                if(state.isOpened()){
                    Util.logd("Opened+Publishing Request");
                    publishPhotoRequest(session);
                }

                if(session.isOpened()){
                    Util.logd("Session is Opened");
                    getUserDetails(session);
                }
            }
        });
4

1 回答 1

0

要意识到的一件事是会话打开是异步的(因为它可能需要调用 Facebook 应用程序并获取用户输入)。因此,您不能在不等待第一个返回的情况下连续进行两次 session.open* 调用。

您的代码中发生的是:

if (session.isOpened()) {
  // MAKE AN OPEN REQUEST
}
// MAKE ANOTHER OPEN REQUEST

如果您的会话已经打开,这基本上会连续发出 2 个打开请求。

那么你如何解决这个问题?

首先,session.requestNewReadPermissions()调用是不必要的,因为它只要求“basic_info”,这是默认情况下出现的,所以你不需要要求任何额外的权限。您可以删除整个块。

其次,如果您确实想请求额外的读取权限,您可以将它们添加到session.openForRead()您稍后调用的方法中。

最后,我注意到您的代码的其他几个问题:您在调用之后添加回调session.openForRead(),这可能不会按您想要的方式工作。您需要将回调添加到您的request, 并且在您调用 openForRead 之前。您还尝试发布照片,但我没有看到请求任何发布权限。

于 2013-11-05T19:03:52.603 回答