【问题标题】:Android Facebook SDK 3.0 authAndroid Facebook SDK 3.0 身份验证
【发布时间】:2013-01-02 22:46:58
【问题描述】:

我实际上是在关注 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

现在在我的 activity 上调用 onActivityResult(不是在片段上,而是在活动部分上)

我在这里打电话

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

这里的 requestCode 是 requestCode 129742

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

【问题讨论】:

  • 你能发布你得到的值是什么吗?如果您未在 OpenRequest 中指定请求代码,它将使用默认代码(不是随机的)。另外,你是从你的活动的 onActivityResult 调用 session.onActivityResult 吗?
  • @MingLi 我已经用完整的流程更新了我的问题。你知道如何解决它吗?
  • 原始示例(随 SDK 提供)是否适合您?第一个请求代码(64206)是十六进制的 0xface,这是默认代码(可以在 Session.java 中看到)。第二个(129742)是十六进制的 0x1face,我不确定它来自哪里。如果您可以发布更完整的代码示例来重现该问题,我可以尝试进一步缩小范围。
  • @MingLi,你能缩小这个问题的原因吗?我遇到了同样的问题,除了我使用的数字是 62406(0xface)和 326350(0x4face),但我已经调用 super.onActivityResult 作为这个问题的唯一答案。
  • @GiulioPiancastelli 这已经一岁了,所以您可能发现自己的方式错误。如果其他人(像我一样)偶然发现这个荒谬的错误,我发现错误是在我的活动中的 onActivityResult 方法中,我写了 super.onActivityResult(requestCode, requestCode, data) 而不是 super.onActivityResult(requestCode, resultCode, data) .自动完成! :)

标签: android facebook facebook-android-sdk


【解决方案1】:

我遇到了同样的问题,除了在我的情况下,有问题的 requestCode326350 (0x4face)。而且我确实打电话给super.onActivityResult,所以workaround proposed by 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 中修复的错误,并且会坚持在下一个版本中对其进行修补。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-27
      • 1970-01-01
      • 2013-08-26
      • 2018-02-24
      • 2011-07-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多