Facebook SDK v3.5.2 - 来自已关闭会话的请求权限

时间:2013-11-19 17:03:47

标签: java android facebook session

当用户点击取消按钮时,它会关闭facebook会话。

Facebook权限请求对话框:http://imgur.com/2PiYGrK

我正在尝试从用户在Facebook权限请求对话框中点击“取消”时显然已关闭的会话中请求权限。当我尝试openActiveSession而没有requestNewReadPermissions时,只请求基本权限,但是当我这样做时,我收到此错误:

E / AndroidRuntime(12619):java.lang.UnsupportedOperationException:Session:尝试为已关闭的会话请求新权限

以下代码来自Facebook SDK v3.5.2 LoginUsingActivityActivity.java 示例,我刚刚补充道:

Session.NewPermissionsRequest request = new Session.NewPermissionsRequest(this, PERMISSIONS);
session.requestNewReadPermissions(request);

以下是代码:

private static final List<String> PERMISSIONS = Arrays.asList("user_birthday", "user_friends","user_hometown","user_location","email");

private void onClickLogin() {
        Session session = Session.getActiveSession();
        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(PERMISSIONS));
        } else {
            Session.openActiveSession(this, true, statusCallback);
            Session.NewPermissionsRequest request = new Session.NewPermissionsRequest(this, PERMISSIONS);
            session.requestNewReadPermissions(request);
        }
    }

我正在寻找解决方案,显然我必须销毁当前会话并创建一个新会话。这有效,但我认为这是一个糟糕的代码。还有另一种方法可以重新打开会话并请求新的权限吗?

private void onClickLogin() {
        Session session = Session.getActiveSession();
        if (!session.isOpened() && !session.isClosed()) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(PERMISSIONS));
        } else {
            session.closeAndClearTokenInformation();
            session = null; 
            session = new Session(this);

            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback).setPermissions(PERMISSIONS));
        }
    }

1 个答案:

答案 0 :(得分:1)

我必须做很多变通办法才能做到这一点,我不会建议你继续这条路径,新的SDK有一些不完美的回调,但它们会为你的工作而努力正在努力实现:

https://developers.facebook.com/docs/android/upgrading-4.x

只需按照这些指南进行更新,您就会看到改进的SDK体验,更少的代码,更少的错误,以及更好地控制回调的内容。