我实际上是在关注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源代码中的代码。请求代码与会话相同(这里没问题)。
当fb登录系统时,它将完成他的facebook.LoginActivity并在我的活动中回复我的onActivityResult。问题是这里requestCode与请求的不同。我不知道它为什么以及它来自哪里!
如果我进入我的fb帐户,我的应用程序就在那里,这意味着我已经完成了正确的身份验证流程。但是由于这个问题,我不会从我的应用程序中正确验证。
你知道为什么以及如何解决它?
感谢。
使用流程细节进行更新:
这是实际流程(来自片段):
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不同,并且这个break(getActiveSession()。onActivityResult返回而不执行代码)登录客户端部分。
答案 0 :(得分:5)
我遇到了同样的问题,但在我的情况下,有问题的requestCode
是326350
(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中修复的错误,并且会坚持在下一个版本中修补它。
答案 1 :(得分: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) {
// ...
}
}
你“只能使用低16位的requestCode”,如FragmentActivity.startActivityFromFragment中所述