Facebook SDK集成打开会话崩溃

时间:2013-11-05 06:15:15

标签: facebook-android-sdk

使用Facebook SDK创建打开请求时,我收到以下错误。

错误:

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

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

以下是代码:

OpenRequest request = 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);
                }
            }
        });

1 个答案:

答案 0 :(得分: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。您还尝试发布照片,但我没有看到任何要求的发布权限。