Facebook SSO示例无效 - “发生错误。请稍后再试”

时间:2011-03-06 17:02:21

标签: android facebook facebook-android-sdk

我正在尝试将Facebook集成到我的应用程序中,因此遵循教程:Facebook Android但我无法获得第一个示例(单点登录)。当我的应用程序加载时,我得到了facebook对话框,但它只是说“发生错误。请稍后重试。”在底部有一个facebook风格的“Ok”按钮,logcat中没有任何内容: App showing Facebook error

我按照教程中的步骤操作,但我猜测APP ID或keytool生成的hashkey有问题。以下是我遵循的步骤:

  1. clone fb git。
  2. 创建fbSDK项目。
  3. 创建自己的fb项目并将fbSDK链接为库。
  4. 然后我用openssl做了keytool cmd,并按照stackoverflow上其他人的建议输入密码“android”。
  5. 我去了developers.facebook.com并创建了一个新的应用程序。
  6. 在“修改设置 - >移动设备和设备”中,我将哈希放在提供的框中。
  7. 在“修改设置 - >移动设备和设备”中,我选择“原生应用”作为“应用类型”
  8. 回到应用程序中,我复制并粘贴了SSO示例代码。
  9. 我将Facebook()构造函数中的“YOUR_APP_ID”更改为我的新应用程序的developers.facebokk.com页面上显示的APP ID。
  10. 我在手机上运行了应用程序。
  11. 我不知道为什么logcat中没有任何东西,但是当我安装它时,控制台总是会毫不犹豫地说:ActivityManager: Warning: Activity not started, its current task has been brought to the front

    我找不到任何对我的应用程序的logcat引用或我从facebook sdk获得的错误:Facebook-ProxyAuth(4828): Failed to read calling package's signature.

    我已经在这里待了几个小时,任何帮助都将不胜感激。我无法相信facebook SDK和Android的帮助是如此粗略,Facebook应该为自己感到羞耻。

    谢谢,

    InfinitiFizz

5 个答案:

答案 0 :(得分:2)

你必须从一个单独的线程调用.request()。如果您在UI线程上执行此操作,则在您的代码执行之前,facebook授权不会完成。所以在facebook授权的“onComplete”中调用新线程。此时您将拥有有效的访问令牌。祝你好运!

(这就是为什么api说“不要从UI线程调用它!”。)

答案 1 :(得分:2)

事实上,我确实遇到了同样的问题而且它已经解决了。 因此,在哈希密钥生成中使用以下步骤:

  1. 打开cmd并转到Android SDK路径。
  2. 输入以下命令: keytool -exportcert -alias androiddebugkey -keystore [你的SDK路径|例如c:\ users \ user] .android \ debug.keystore | openssl sha1 -binary | openssl base64
  3. 之后,密码输入“android”
  4. 将结果复制到您的Facebook应用设置并保存设置。
  5. 在你的Android应用程序中使用facebook app id(不是android哈希键)。

答案 2 :(得分:1)

我有这个问题只是因为我在用正确的密钥正确初始化facebook对象之前调用了facebook api。只需确保使用正确的密钥,然后正确初始化Facebook对象。

此外,我还尝试使用不同的Android应用程序密钥进行facebook api调用,绊倒了几次。请记住,facebook教程指示您使用已编译的apk创建密钥。如果您要从IDE运行代码(我正在使用Eclipse),则此密钥哈希将不同。当您直接从eclipse运行您的应用程序时,Facebook密钥会有所不同,因为从eclipse运行您的应用程序时,它使用默认的发布密钥来构建您的应用程序。

因此我在facebook开发者门户网站上通常有两个键。使用用于Android市场的release-key编译的apk创建的一个密钥,以及直接从eclipse运行应用程序代码创建的另一个密钥。

答案 3 :(得分:0)

您在步骤7中选择Native App的原因是什么?我将其保留在默认的HTML5 /移动网络上,并使样本生效。

答案 4 :(得分:0)

正确找出你的哈希值的最好方法是这段代码。:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.facebook.samples.loginhowto", 
                PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }
    ...

将com.facebook.samples.loginhowto替换为您自己的包名。