安卓Facebook SDK 3.0认证

7

我正在按照Facebook SDK示例中的SessionLoginFragment.java进行操作。

我真正不理解的是:

当我执行

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

为了将我的用户登录到Facebook并请求基本读取权限(只是为了测试集成),它根本不起作用。
我用调试器挖掘了一下,然后跟着路径走。如果您没有将requestCode放入会话的OpenRequest中,它将随机生成一个(这很好)。
openForRead(我的实际会话处于CREATED状态)将创建权限对话框。当您点击“确定”按钮时,它将执行一个操作。
request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode());

您可以从fb sdk源代码中查看代码。requestCode与会话相同(这里没问题)。
当fb将您登录到系统时,它将完成其facebook.LoginActivity并在我的活动中调用我的onActivityResult。问题在于此处的requestCode与请求的不同。我不知道它来自哪里和为什么!
如果我进入我的fb帐户,我的应用程序就在那里,这意味着我已经完成了正确的授权流程。但由于这个问题,我无法从我的应用程序中获得正确的身份验证。
您知道为什么以及如何解决它吗?
谢谢。
更新流程详细信息:
这是实际流程(来自片段):
session.openForRead(new Session.OpenRequest(fragment).setCallback(statusCallback));

创建完成后,请求代码始终为64206。现在,打开读取流程将调用(最后一部分)。
request.getStartActivityDelegate().startActivityForResult(intent, request.getRequestCode());

使用Facebook SDK调用LoginActivity并进行客户端/服务器验证和OAuth授权。

现在,在我的活动中调用onActivityResult函数(不是在片段中,而是在活动部分)。

然后,我在这里调用:

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

这里的requestCode是129742

怎么会这样呢?正如我之前所说,所有流程中的问题在于返回给onActivityResult的requestCode与我的pendingRequest requestCode不同,这破坏了登录客户端部分(getActiveSession().onActivityResult不执行代码便返回)。


你能发布一下你得到的值是什么吗?如果在OpenRequest中没有指定请求代码,它会使用默认代码(而不是随机代码)。另外,你是否从你的Activity的onActivityResult中调用了session.onActivityResult? - Ming Li
@MingLi,我已经更新了我的问题,并提供了完整的流程。你有什么解决办法吗? - StErMi
3
SDK提供的原始样本是否对您有效?第一个请求代码(64206)在十六进制中为0xface,这是默认代码(您可以在Session.java中看到)。第二个代码(129742)在十六进制中为0x1face,我不确定它来自哪里。如果您可以发布更完整的代码示例以重现问题,我可以尝试进一步缩小范围。 - Ming Li
@MingLi,你能够缩小这个问题的原因吗?我遇到了同样的问题,只不过我要处理的数字是62406(0xface)和326350(0x4face),但是我已经像这个问题的唯一答案建议的那样调用了super.onActivityResult。 - Giulio Piancastelli
@GiulioPiancastelli 这是一年前的帖子,所以你可能已经找到了错误的原因。如果其他人(像我一样)偶然发现了这个荒谬的错误,那么我发现错误在于我的活动中的onActivityResult方法中,我写成了 super.onActivityResult(requestCode, requestCode, data) 而不是 super.onActivityResult(requestCode, resultCode, data)。自动完成! :) - hordurh
2个回答

5

我遇到了同样的问题,但在我的情况下,有问题的requestCode3263500x4face)。而且我确实调用了super.onActivityResult,所以Eric Savage提出的解决方法已经实施但不起作用。最奇怪的是,这个东西几周前还能工作,而且出现问题时我没有升级任何东西(Facebook SDK版本、Android版本、支持库版本,甚至我正在开发/测试的手机都与我之前成功运行时一样)。

然而,Eric的答案包含其他有趣的提示,我利用它们使我的代码再次工作。基本上,我不是将整个requestCode传递给Session.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中应该修复的错误,并坚持要求在下一个版本中解决它。


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所述,您只能使用requestCode的低16位。

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