在我的一个应用程序中,我需要从Facebook获取数据…我是这样做的:

我已经创建了应用ID。它成功登录,但注销后,我登录,然后它给我:

我做错了什么?我正在使用Facebook SDK…我已经在手机上安装了Facebook。它在模拟器中运行良好,但没有安装内置的Facebook应用程序。

这是我的代码:

if (FB_APP_ID == null) {
    Builder alertBuilder = new Builder(this);
    alertBuilder.setTitle("Warning");
    alertBuilder.setMessage("A Facebook Applicaton ID must be " +
                            "specified before running this example: see App.java");
    alertBuilder.create().show();
}

// Initialize the dispatcher
Dispatcher dispatcher = new Dispatcher(this);
dispatcher.addHandler("login", LoginHandler.class);
dispatcher.addHandler("stream", StreamHandler.class);
dispatcher.addHandler("logout", LogoutHandler.class);

// If a session already exists, render the stream page
// immediately. Otherwise, render the login page.
Session session = Session.restore(this);
if (session != null) {
    dispatcher.runHandler("stream");
}
else {
    dispatcher.runHandler("login");
}

当前回答

经过长时间的研究,我们找到了解决办法。

我们将权限设置为:

loginButton.setReadPermissions(public_profile email);

这是第一次工作,但当我们重新登录Facebook时,它给出了无效的哈希错误。

简单的解决方案是将上面的行更改为:

loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));

它的工作就像一种幸福!

Facebook应该返回正确的异常,而不是误导性的无效哈希键错误。

其他回答

在你的活动的onCreate()方法中使用以下代码:

try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           "your application package name",
                           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) {
}

运行此代码。这将生成哈希键。在Facebook应用程序设置中复制此KeyHash,并保存更改。然后登录到您的应用程序。这在将来也会非常有效。

我通过在MainApplication.onCreate中添加以下内容来修复这个问题:

try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           "com.genolingo.genolingo",
                           PackageManager.GET_SIGNATURES);

    for (Signature signature : info.signatures) {
        MessageDigest md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        String hash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
        KeyHash.addKeyHash(hash);
    }
}
catch (PackageManager.NameNotFoundException e) {
    Log.e("PackageInfoError:", "NameNotFoundException");
}
catch (NoSuchAlgorithmException e) {
    Log.e("PackageInfoError:", "NoSuchAlgorithmException");
}

然后我将其上传到谷歌开发人员控制台,然后下载了派生的APK,无论出于什么原因,它具有完全不同的键散列。

然后我使用LogCat来确定新的密钥散列,并将其添加到Facebook,就像其他用户所概述的那样。

尽管这个问题已经回答了很多有用的方法,我只是想补充说,当我遵循Rafal Maleks的答案(使用谷歌Play Console上的散列键),我无法使用应用程序签名SHA1密钥,仍然从Facebook得到了一般错误。相反,我需要使用来自上传证书部分的SHA-1证书指纹(就在谷歌Play Console的应用程序签名部分的下面)。否则,同样的过程;

从谷歌播放控制台的“上传证书”中拷贝SHA-1证书指纹 使用:http://tomeko.net/online_tools/hex_to_base64.php转换SHA-1并复制输出(base64) 将其粘贴到developer.facebook.com上的Key Hashes输入中并保存更改。

希望这个答案不是多余的,并将帮助那些不能让它与应用程序签名证书一起工作的人。

现在Facebook登录工作在我的应用程序在调试和发布模式。

我是这样解决这个问题的:

首先,您必须获得SHA-1值。有两种方法。

在Android Studio中获取SHA-1值。

点击它 点击签署报告 复制SHA-1的值

OR

从密钥存储文件中获取SHA-1值。

keytool -list -v -keystore keystore_file_name.jks -alias key0

复制SHA-1值到你的剪贴板,像这样:

CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84

并打开十六进制-> Base64字符串解码器将您的SHA-1值转换为Base64。

这正是Facebook所需要的。

获取生成的哈希值“********************=”,并将密钥哈希值复制到Facebook应用程序。

经过长时间的研究,我们找到了解决办法。

我们将权限设置为:

loginButton.setReadPermissions(public_profile email);

这是第一次工作,但当我们重新登录Facebook时,它给出了无效的哈希错误。

简单的解决方案是将上面的行更改为:

loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));

它的工作就像一种幸福!

Facebook应该返回正确的异常,而不是误导性的无效哈希键错误。