7

我实际上是在关注 facebook sdk 示例中的 SessionLoginFragment.java 示例。

我真的不明白的是:

当我做

session.openForRead(new Session.OpenRequest(fragment).setCallback(statusCallback));

将我的用户登录到 facebook 并询问基本的读取权限(只是为了测试集成)它根本不起作用。

我用调试器挖了一点,然后沿着这条路走。如果您没有将 requestCode 放入会话的 OpenRequest 中,它将给它一个随机的(这没关系)。

openForRead(我的实际会话处于创建状态)将创建权限对话框。当您点击“确定”按钮时,它将执行

request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode());

您可以从 fb sdk 源代码中查看代码。那么 requestCode 与会话相同(这里没问题)。

当 fb 将您登录到系统时,它将完成他的 facebook.LoginActivity 并在我的活动中回叫我的 onActivityResult。问题是这里的 requestCode 与请求的不同。而且我不知道它为什么以及它来自哪里!

如果我进入我的 fb 帐户,我的应用程序就在那里,这意味着我已经完成了正确的身份验证流程。但是由于这个问题,我不会从我的应用程序中获得正确的身份验证。

你知道为什么以及如何解决它吗?

谢谢。

更新流程细节:

这是实际流程(来自fragment):

session.openForRead(new Session.OpenRequest(fragment).setCallback(statusCallback));

创建后,请求代码是(总是)64206 现在 openForRead 流将调用(最后部分)

request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode());

从 facebook SDK 调用 LoginActivity 并执行客户端/服务器验证/oauth

现在我的活动被称为 onActivityResult (不是在片段上,而是在活动部分)

我在这里打电话

Session.getActiveSession().onActivityResult(activity, requestCode, resultCode, data);

这里的 requestCode 是 requestCode 129742

这怎么可能?正如我已经说过的,所有这个流程中的问题是返回到 onActivityResult 的 requestCode 与我的 pendingRequest requestCode 不同,并且这个中断(getActiveSession().onActivityResult 返回而不执行代码)登录客户端部分。

4

2 回答 2

5

我遇到了同样的问题,除了在我的情况下,冒犯的requestCode3263500x4face)。而且我确实在打电话super.onActivityResult,所以Eric Savage 提出的解决方法已经到位但没有效果。最奇怪的是,这些东西在几周前确实有效,而且我没有升级任何东西(Facebook SDK 版本、Android 版本、支持库版本,甚至我正在开发/测试的手机,都是和我让它工作时一样)。

但是,Eric 的回答包含其他有趣的提示,我利用这些提示让我的代码再次工作。基本上,我没有将整个传递requestCodeSession.onActivityResult,而是削减了最低的 16 位并仅传递那些。

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    Session session = Session.getActiveSession();
    int sanitizedRequestCode = requestCode % 0x10000;
    session.onActivityResult(this, sanitizedRequestCode, resultCode, data);
}

我确实相信这是一个应该在 Facebook SDK 中修复的错误,并且会坚持在下一个版本中对其进行修补。

于 2013-06-01T06:42:51.927 回答
4

刚刚遇到同样的问题。64206 (0xface) 和 129742 (0x1face) 之间的区别是因为 FragmentActivity 附加了一个额外的 0x10000 以确定它来自哪个片段。通过确保在 onActivityResult 期间调用了超级活动来解决此问题

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    switch (requestCode) {
        // ...
    }
}

如 FragmentActivity.startActivityFromFragment 中所述,您“只能将低 16 位用于 requestCode”

于 2013-05-28T20:37:13.260 回答