Facebook SDK for Android - 示例应用无法工作

5
好的,我已经完成了所有业务,按照所有步骤操作,但仍然无法使其工作。Facebook SDK附带的简单示例应用程序在模拟器上和安装有Android 1.5的设备上都可以运行。因此,我的猜测是单一登录问题。
如果我是对的,那么我应该生成一个密钥散列值,并且有人告诉我正确的调试密钥库位于 “C:\Users\xxx.android\debug.keystore”。所以我按照教程进行操作。
从google.code下载了OpenSSL,在终端中输入类似以下内容:
"C:\Program Files\Java\jdk1.6.0_22\bin\keytool.exe" -exportcert -alias androiddebugkey -keystore "C:\Users\JoeZ.android\debug.keystore"|"C:\Users\xxx\Downloads\openssl-0.9.8k_X64\bin\openssl.exe" sha1 -binary|"C:\Users\xxx\Downloads\openssl-0.9.8k_X64\bin\openssl.exe" base64
然后我得到了一个不错的密钥,将其插入Facebook中的Android Key Hash框中,无论输出后是否带有=符号,我都尝试过,但似乎没有任何作用。
当我尝试登录示例应用程序时,我只会得到“invalid_key”。我甚至尝试过签名的应用程序,但它也没有起作用。如果我没记错的话,示例应用程序中唯一需要编写的就是我的APP_ID,对吗?
我正在开发自己的应用程序时遇到了完全相同的问题。所以请问有人能帮帮我吗?
3个回答

15
如果keytool命令对你不起作用,我找到了一个解决办法:你可以反向工程找出要放在Facebook开发者部分的Key Hash。在你的Activity中,只需通过以下方式打印出Key Hash即可:
try {
   PackageInfo info = getPackageManager().getPackageInfo("[your package name, e.g. com.yourcompany.yourapp]", PackageManager.GET_SIGNATURES);
   for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        Log.d("Hash Key:", Base64.encode(md.digest()));
   }
} catch (NameNotFoundException e) {

} catch (NoSuchAlgorithmException e) {

}

这对我有用。MessageDigest类包含在JDK中,而Base64类不包括在其中。你可以使用这个作为例子。


我的应用程序运行得非常好 :-) +1 - Mark Mooibroek
1
这对我不起作用。我收到错误消息:“Base64中的方法encode(ByteBuffer,ByteBuffer)不适用于参数(byte [])”在Base64.encode(md.digest())上。我想通了,必须更改为encodeBytes。 - easycheese

5

我有一个类似的问题。对于我来说,当我卸载了Facebook应用程序的最新更新后,问题得到了解决,现在我只有本机的Facebook应用程序v1.2。(这意味着,当我进入市场并搜索Facebook时,“Facebook for Android”将显示为“未安装”)。

在我的Nexus One(Android 2.2.1)上,当我安装了最新的Facebook应用程序时,没有“卸载应用程序”的按钮,只有“卸载最新更新”,这就是我所做的。事实上,出于某种原因,我甚至无法卸载整个Facebook(现在是v1.2)应用程序,卸载按钮被禁用/灰色。但在这种状态下,样例似乎可以工作。

至少,我可以用这种方式让简单和流应用程序工作。

编辑/解决方案:

好的,我现在搞定了。我发现我复制/粘贴了错误的密钥哈希,这是由于Windows下keytool的一些奇怪行为和Facebook SDK ReadMe文件中错误的命令语法造成的。

要使用的参数应为"keytool -export ..."而不是"keytool -exportcert ...";如果您确实使用第二个/错误的参数,keytool仍会打印出哈希码(尽管没有要求任何密钥密码),但哈希码是错误的。

现在我也让SSO工作了。

这是我在Windows上的调用:

keytool -export -alias androiddebugkey -keystore "C:\Documents and Settings\myuser\.android\debug.keystore" | openssl sha1 -binary | openssl enc -a -e

这个方法虽然可行,但不是最终解决方案。如果我理解得正确,单点登录意味着它应该无需登录即可工作,并只询问权限。如果设备上不存在单点登录,则会退回到简单的Web视图。我猜如果我卸载更新,单点登录就会被禁用,我必须登录。这意味着示例应用程序将起作用。所以如果我没错的话,我必须做错了其他事情。 - Joakim Engstrom
我理解你的意思,但我也无法将其实现。如果你有任何进展,请更新我,我也会这样做。 - Mathias Conradt
然而,这并不理想,因为单个插件仍然无法正常工作。但至少现在您可以登录并使用它了。原始问题仍需要解决方案。 - Joakim Engstrom
请在此处点赞该问题:https://github.com/facebook/facebook-android-sdk/issues/issue/144 - Mathias Conradt
我已经让它工作了。但是在我的Mac上,似乎窗口参数有些问题,或者是我在Windows上编写的方式有问题。 - Joakim Engstrom
显示剩余3条评论

0

我按照你的解决方案在Windows上尝试了export和exportcert,但生成的哈希值相同。应用程序现在像以前一样工作,并没有使用新的SSO方式。

我调试了Android FB SDK,找到了原因,但不知道确切的解决方案。不知道为什么Facebook的人这样实现SSO。

  1. 如果您的Android手机上没有安装FB应用程序的新更新,则SSO无法正常工作。

  2. 在这种情况下,它会路由到常规的对话框界面,要求输入用户名和密码。

3.具体来说,FB Android SDK处理SSO时,调用一个名为com.facebook.katana.ProxyAuth的意图,如果更新可用,则返回true。

  1. 如果用户已经登录并拥有新的更新,则验证用户。

希望这可以帮助到您。


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