安卓Facebook SDK3.0,会话状态为OPENING。

18

我正在尝试使用Facebook SDK 3.0在我的Android应用程序中按下按钮时检索访问令牌。 我的Activity中有一个通用按钮,它执行以下操作:

Button facebook = (Button)findViewById(R.id.facebookLoginButton);
    facebook.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Session session = new Session(getApplicationContext());
            Session.setActiveSession(session);
            session.openForRead(new Session.OpenRequest(SignInActivity.this).setCallback(statusCallback));
        }
    });

然后是回调函数:

private class FacebookSessionStatusCallback implements Session.StatusCallback {
    @Override
    public void call(Session session, SessionState state, Exception exception) {
            String s=session.getAccessToken();
    }
}

点击按钮后,正如预期的那样,我被要求允许访问我的个人资料,但是这个回调只会被调用一次,并且状态始终为“OPENING”,之后不再变化。

我在这里错过了什么?我的最终目标只是获取一次访问令牌,而我并不真的关心持久化会话或使用它来登录我的应用程序。

2个回答

69

您需要覆盖 onActivityResult 方法,以便在 Android 上检查凭据针对 Facebook(或内联登录)后,处理结果并更新会话。 添加以下代码:

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

那是一个快速的修复,谢谢!快速跟进问题-我该如何设置requestCode以便在onActivityResult中检查它是否来自Facebook? - k_day
请参考 https://developers.facebook.com/docs/reference/android/3.0/Session.OpenRequest ,你可以像下面这样操作:session.openForRead(new Session.OpenRequest(SignInActivity.this).setCallback(statusCallback).setRequestCode(200)); 然后在这个例子中检查代码 200。 - C Abernathy
3
是的,当使用UiLifecycleHelper时,您需要调用onActivityResult()。确保在调用UiLifecycleHelper实例上的方法之前先调用super.onActivityResult()。 - C Abernathy
如果这样仍然解决不了问题怎么办?我已经重写了onActivityResult,但是我的会话仍在OPENING和CLOSED_LOGIN_FAILED之间交替...? - Lucas Jota
对于那些将FacebookAuthentication作为AsyncTask的一部分实现的人,这里有一个提示:您需要在被操作的Activity上像上面那样实现onActivityResult。截至SDK v3.5仍然适用。感谢这个提示! - garromark
显示剩余2条评论

1

@Lucas Jota:尝试更改请求代码,这对我有用。 session.openForRead(new Session.OpenRequest(LoginActivity.this).setCallback(statusCallback).setRequestCode(urRequestCode)); 同时确保您的活动没有“single instance”属性。


1
感谢提醒,“确保您的活动没有“单实例”属性。我尝试使用单例类,结果第二次登录时onActivityResult未被调用。” - Yu Lu
@Yu Lu,你的评论真是救命稻草。我一直在正确地操作,但仍然遇到了问题。原来是在我的清单文件中设置了noHistory="true",导致了这个问题。 - Arun Badole

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接