2

所以,我有一个Dialog带有“分享”的按钮。当按钮被按下时,它会调用一个方法来共享用户信息,如果他们已经登录到 Facebook。但是,如果他们没有登录 Facebook,我希望它首先允许用户登录,然后分享他们的信息。这是我尝试在没有 的情况下登录用户LoginButton

    Session.OpenRequest openRequest = new Session.OpenRequest(GameActivity.this);
                    StatusCallback callback = new StatusCallback(){

                        @Override
                        public void call(Session session, SessionState state, Exception exception) {
                            Log.d(TAG, "CALL");
                            if (Session.getActiveSession() != null && Session.getActiveSession().isOpened()){
                                Log.d(TAG, "sendBrag was called");
                                sendBrag();
                            }else{
                                Log.d(TAG, "session is not opened");
                            }
                            if (exception != null){
                                Log.d(TAG, "caught exception in call method");
                            }
                        }
                    };
                    openRequest.setCallback(callback);
                    openRequest.setDefaultAudience(SessionDefaultAudience.FRIENDS);
                    openRequest.setPermissions(PERMISSIONS);
                    Session session = new Session(GameActivity.this);
                    session.openForPublish(openRequest);
                    Session.setActiveSession(session);

其中,PERMISSIONS是:

private static final List<String> PERMISSIONS = Arrays.asList("publish_actions");

问题是它永远不会登录!我要么收到一条Toast消息,说明“检查您的网络连接”(即使我的网络连接正常),要么什么也没发生。但从日志中我可以看出 Session 永远不会打开。总结一下:您如何使用该Session课程正确登录 Facebook?我在这里想念什么?任何帮助、建议或建议将不胜感激,谢谢!

4

1 回答 1

4

我找到了解决问题的方法,该解决方案SessionLoginSample位于Facebook SDK. 首先,在onCreate我的活动中的方法中,我输入了以下代码:

    Session session = Session.getActiveSession();
    if (session == null) {
        if (savedInstanceState != null) {
            session = Session.restoreSession(this, null, statusCallback, savedInstanceState);
        }
        if (session == null) {
            session = new Session(this);
        }
        Session.setActiveSession(session);
        if (session.getState().equals(SessionState.CREATED_TOKEN_LOADED)) {
            session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
        }
    }

在哪里statusCallback

private Session.StatusCallback statusCallback = new SessionStatusCallback();

我活动中的SessionStatusCallback内部课程是:

    private class SessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
        if (session.isOpened() && session != null){
            sendBrag();
        }
    }
}//end of SessionStatusCallback class

然后,我创建了一个Facebook在用户尚未登录时处理登录的方法:

    private void onClickLogin() {
    Session session = Session.getActiveSession();
    if (!session.isOpened() && !session.isClosed()) {
        session.openForRead(new Session.OpenRequest(this).setCallback(statusCallback));
    } else {
        Session.openActiveSession(this, true, statusCallback);
    }
}//end of onClickLogin() method

我从“分享”按钮中调用。最后,我认为代码中最重要的部分是onActivityResult()方法:

    @Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session.getActiveSession().onActivityResult(this, requestCode, resultCode, data);
}//end of onActivityResult() method

这就是他们真正的目的。虽然,我不知道为什么它完全有效,因为我使用该方法openForRead而不是,openForPublish但它似乎有效。我希望这对遇到与我相同的问题的人有所帮助。

于 2013-04-23T00:48:14.307 回答