Android Facebook与无效密钥哈希的集成

Android Facebook与无效密钥哈希的集成,android,facebook,Android,Facebook,在我的一个应用程序中,我需要从Facebook获取数据。。。我正在这样做: 我已经创建了应用程序ID。它成功登录,但在注销后,我登录,然后它给我: 我做错了什么?我正在使用Facebook SDK。。。我已经在手机上安装了Facebook。。。它在模拟器中运行良好,但没有安装内置的Facebook应用程序 这是我的代码: if (FB_APP_ID == null) { Builder alertBuilder = new Builder(this); alertBuilder

在我的一个应用程序中,我需要从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");
}
根据,必须提供密钥哈希值。为了获得它,您将需要用于签署申请的证书

keytool \
    -exportcert \
    -alias YourKeyAlias \
    -storepass YourStoreKeyPassword \
    -keystore PathToYourKeyStoreFile | openssl sha1 -binary | openssl base64

生成的哈希键错误。您可以使用两个步骤获得哈希键

一种是通过命令提示符。另一个是通过编码。通过命令提示符的散列键仅在第一次工作。我不知道原因。我也有同样的问题。所以我用编程的方式试过了

遵循以下步骤:


将以下代码粘贴到
oncreate()

在上面的编码中使用您的包名修改“com.example.packagename”,不会失败(您可以在Android清单文件中找到您的包名)

运行应用程序。转到粘贴上述代码的活动。在LogCat文件中,搜索“KeyHash”。您可以找到一个密钥散列。复制密钥散列并转到Facebook应用程序仪表板页面。转到“设置”并输入如下图所示的详细信息

完成上述步骤后,重新启动应用程序。你现在可以登录Facebook了。 有关密钥哈希的更多详细信息,请查看


如果在“设置”页面中添加错误信息,则意味着会出现一些错误。因此,请使用正确的信息。此外,如果公众(除您之外)需要使用您的应用程序,则意味着您需要启用权限(在设置旁边的“状态和审阅”中更改“是”)。

将以下代码粘贴到OnCreate方法中:

try {
    PackageInfo info = getPackageManager().getPackageInfo(
                           "com.example.packagename",
                           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) {
    e.printStackTrace();
}
catch (NoSuchAlgorithmException e) {
    e.printStackTrace();
}

只需修改包名。然后转到LogCat文件并在此处选择调试搜索。然后您将找到散列键。现在复制此哈希键,然后转到developer.facebook.app_id站点,编辑哈希键,然后按Save。现在再次运行您的Android项目。我想问题会解决的。

我也遇到过同样的问题。我对这种奇怪行为的可能原因做了一个简短的研究,发现如下:

  • 在新Facebook应用程序的首次执行期间,即使您没有指定任何密钥哈希,它也将允许连接/登录。

  • 对我来说,Facebook提供的教程没有生成正确的密钥散列,因为它给出了错误的配置。执行时:

    keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl
    base64
    
确保您检查了所有属性—
HOMEPATH
、密钥库的存在等。可能您还需要提供密码

  • 生成正确配置的是@Mahendran建议的解决方案

  • 此外,如果您看到最初发布的错误(),则屏幕上看到的密钥散列很可能是您的真实密钥。如果其他方法无效,请尝试将其输入Facebook


我通过Windows 7 64位版本、Android Studio 1.2.2、JDK 7获得了所有这些结果。

在活动的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,并保存更改。然后登录到您的应用程序。这在将来也会很好地工作。

我也有同样的问题首先登录,很好,但随后是无效的密钥散列。

用于Unity的Facebook SDK获取了错误的密钥散列。它从“C:\Users\“your user.android\debug.keystore”中获取密钥,在一个完美的世界中,它应该从您在项目中创建的密钥库中获取密钥。这就是它告诉您密钥散列未注册的原因


根据的建议,您可以按照上的步骤查找正确的键。只需确保将它们指向项目中的密钥库即可。否则您将无法获得正确的密钥。

如果您遇到此问题,请将此密钥放入您的:

然后确保你的应用程序已启动

此绿色圆圈表示应用程序处于活动状态:

如果不是,请按照以下两个步骤使您的应用程序生效:

步骤1转到您的应用程序→设置添加联系人电子邮件并应用保存更改

第2步转到应用程序审查选项,确保此切换为是。我添加了一个屏幕截图:


注意:如果要复制hashkey,请检查BlueService队列。

我遇到了同样的问题。我确信这是由于非常小的错误,是的

我找到了解决办法:

在我的计算机中生成调试哈希键时,我输入了系统的密码。但是密码应该如下所示-

输入密钥库密码:“android”。 这是我唯一的问题

-----要生成Debug密钥散列,请使用以下命令-

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
keytool -exportcert -alias "alias of keystore" -keystore "Your path to the keystore when signing app" | openssl sha1 -binary | openssl base64
输入密钥库密码:“android”

-----要生成Release密钥散列,请使用以下命令-

keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
keytool -exportcert -alias "alias of keystore" -keystore "Your path to the keystore when signing app" | openssl sha1 -binary | openssl base64

执行此命令后提供密钥库密码。

经过长期研究,我们找到了解决方案

我们已将权限设置为:

loginButton.setReadPermissions(public_profile email);
这是第一次奏效,但当我们重新登录Facebook时,它给出了无效的哈希错误

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

loginButton.setReadPermissions(Arrays.asList("public_profile", "email"));
这就像是一种幸福


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

这可能会帮助有同样问题的人

  • 使用下面的代码生成密钥散列

    keytool -exportcert -alias <your_keystore> alias -keystore <your_keystore_file> | openssl sha1 -binary | openssl base64
    
    keytool-exportcert-al
    
    android {
        signingConfigs {
            release {
                storeFile file("~/.android/debug.keystore")
                storePassword "android"
                keyAlias "androiddebugkey"
                keyPassword "android"
            }
        }
    }
    
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                               "com.example.packagename",
                               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) {
    }
    
    keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
    
    keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl
    base64
    
    keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
    
    keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
    
    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");
    }
    
    keytool -list -v -keystore keystore_file_name.jks -alias key0
    
    CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84
    
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                               "www.icognix.infomedia",
                               PackageManager.GET_SIGNATURES);
        for (Signature signature : info.signatures) {
            MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            Log.d("YourKeyHash: ", Base64.encodeToString(md.digest(), Base64.DEFAULT));
            Log.d("YourKeyHash: ", Base64.encodeToString(md.digest(), Base64.DEFAULT));
        }
    }
    catch (PackageManager.NameNotFoundException e) {
    }
    catch (NoSuchAlgorithmException e) {
    }