【问题标题】:facebook hash key when using android studio使用android studio时的facebook哈希键
【发布时间】:2013-06-04 11:29:08
【问题描述】:

我正在使用 android studio 开发一个使用 facebook sdk 的应用程序。

当我使用以下命令时

C:\Program Files\Java\jdk1.7.0_21\bin>keytool -exportcert -alias androiddebugkey
 -keystore "C:\Users\ninad\.android\debug.keystore" | "D:\OpenSSL\bin\openssl" s
ha1 -binary |"D:\OpenSSL\bin\openssl" base64

它返回 y5EquINHD6DvwVJFyJTuUEY3NSU=

当使用这个哈希键时,facebook 会显示错误

无效的 android_key 参数。密钥 c33Tm0FL_-kxyaPZq1JBLDh767U 不匹配任何 允许的密钥。

在使用 eclipse 和 android studio 时,facebook 需要的 hash 键是否不同?其中哪个是我正确的哈希键?

我在 Facebook 的应用中添加了两个哈希键。应用程序仍然显示无效的 android_key 参数。

【问题讨论】:

  • 通过代码stackoverflow.com/questions/16767672/…生成哈希键
  • 它返回 c33Tm0FL_-kxyaPZq1JBLDh767U,我在 facebook 页面中给出了这个。但它仍然显示无效的android_key参数
  • developers.facebook.com/docs/getting-started/… 如果你不通过 cmd 生成哈希键,这只是另一种生成哈希键的方法,PackageInfo info = getPackageManager().getPackageInfo("give the package name", 比如粘贴代码时,我更喜欢将此代码放在起始类中
  • 尝试在原生安卓应用中用哈希键替换 c33Tm0FL_-kxyaPZq1JBLDh767U。
  • 我在我的 Facebook 应用中添加了 c33Tm0FL_-kxyaPZq1JBLDh767U。但仍然显示相同的错误

标签: android facebook


【解决方案1】:

你为什么不试试这个代码并检查你正在使用的哈希键。来自 facebook 文档:

除了仔细检查您的密钥哈希生成步骤之外,还有另一个选项可以确保您使用正确的密钥哈希。它涉及更改其中一个示例应用程序中的代码以打印发送到 Facebook 的签名。

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

    // Add code to print out the key hash
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "your.package", 
                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) {

    }
}

【讨论】:

  • 此代码返回 c33Tm0FL_-kxyaPZq1JBLDh767U,我在 facebook 页面中给出了这个。但它仍然显示无效的android_key参数
  • c33Tm0FL_-kxyaPZq1JBLDh767U 绝对不是有效的密钥。
【解决方案2】:

这里是创建 facebook 哈希键的链接:

public class FacebookHashKeyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_facebook_hash_key);
        try {
            PackageInfo info = getPackageManager().getPackageInfo("your.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) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }
}

代码取自here

【讨论】:

  • 我们应该使用 getPackageName() 而不是硬编码吗?
【解决方案3】:

只需在 oncreate 方法中运行即可

private void printHashKey() {

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "-----------PUT YOUR 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 (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }

}

【讨论】:

  • “你是我的英雄”
【解决方案4】:

假设您从 openssl 输出复制粘贴到 facebook 应用程序设置,这样就不会混淆外观相似的字符 O0 或 1l|或 G6...

我最近在 Play 商店中放置了一个诊断程序,该程序会显示为您手机上的任何应用安装的密钥哈希。搜索“GetKeyHash”。它向您显示设备上的所有应用程序,按上次更新时间排序,您可以展开其中任何一个以查看密钥哈希、包名称和有效的活动名称。正确的 GetKeyHash 应用不会请求或使用任何特殊权限,Android 应该在安装时说明。

要在模拟器上运行,也可以通过 http://rightparen.com/android/GetKeyHash.apk 获得。

请注意,如果您在 IDE 中构建应用的调试版本,则密钥哈希将不同于您发送到 Play 商店的零售版本。您可以在 Facebook 开发者控制台中为应用添加多个密钥哈希,以允许使用调试密钥以及零售密钥。

如果这产生相同的结果,则可能存在错误。作为一种潜在的解决方法仅适用于调试密钥,您可以备份 ~/.android/debug.keystore 并删除该文件。下次构建时,android系统会生成一个新的key,可能不会触发bug。此时,您需要从您的设备上卸载该应用程序,否则您将在安装时收到有关需要使用相同证书签名的 apk 的错误消息。然后,您可以使用上述 GetKeyHash 或任何标准方法来获取新的密钥哈希并将其添加到您在 facebook 上的应用程序中。

【讨论】:

  • 我在尝试安装 apk 时遇到以下错误:W/PackageParser: Unable to read AndroidManifest.xml of /data/local/tmp/GetKeyHash.apk java.io.FileNotFoundException: AndroidManifest.xml
  • @KamenDobrev 感谢您让我知道。这里的其他答案可能会做你想要的。 Fwiw,我已经让我的开发者协议到期,所以 Google Play 告诉我该应用程序已被删除。不过我刚刚更新了它,所以运气好的话,你明天应该可以安装它,以防万一证明有用。很抱歉给您带来麻烦。
【解决方案5】:

您可以列出该文件中的当前别名。然后您可以使用正确的名称来获取哈希... .密码留空,按回车键...

keytool -list -keystore keystorefile

*****************  WARNING WARNING WARNING  *****************
* La integridad de la información almacenada en el almacén de claves  *
* NO se ha comprobado.  Para comprobar dicha integridad, *
* debe proporcionar la contraseña del almacén de claves.                  *
*****************  WARNING WARNING WARNING  *****************

Tipo de Almacén de Claves: JKS
Proveedor de Almacén de Claves: SUN

Su almacén de claves contiene 1 entrada

androiddebugkey, Sep 22, 2016, PrivateKeyEntry, 
Huella Digital de Certificado (SHA1): 3B:8F:DB:46:A0:B7:2E:37:E1:78:41:10:BD:D0:8A:FF:63:E0:94:22

如您所见.. 有 1 个名称为 androiddebugkey 的键...可能在您的情况下您有那个... o 没有在您运行时写下具体的:

{C:\Program Files\Java\jdk1.7.0_21\bin>keytool -exportcert -alias androiddebugkey
 -keystore "C:\Users\ninad\.android\debug.keystore" | "D:\OpenSSL\bin\openssl" s
ha1 -binary |"D:\OpenSSL\bin\openssl" base64
}

它会返回任何它想要的东西......在这种情况下。

y5EquINHD6DvwVJFyJTuUEY3NSU=

【讨论】:

    【解决方案6】:

    我个人喜欢在应用程序build.gradle 文件中生成我的哈希。

    build.gradle 函数将在 Windows 上生成哈希(将 C:\\OpenSSL-Win64\\bin\\openssl 更改为您的 OpenSSL 二进制位置):

    def getFacebookHash = { ->
        try {
            def stdOut = new ByteArrayOutputStream()
            def stdIn = new ByteArrayInputStream()
            exec {
    
                commandLine "keytool", "-exportcert", "-alias", KEY_ALIAS, "-keystore", STORE_FILE, "-storepass", STORE_PASSWORD
                standardOutput = stdOut
            }
            stdIn = new ByteArrayInputStream(stdOut.toByteArray())
            stdOut = new ByteArrayOutputStream()
            exec {
                standardInput = stdIn
                commandLine "C:\\OpenSSL-Win64\\bin\\openssl", "sha1", "-binary"
                standardOutput = stdOut
            }
            stdIn = new ByteArrayInputStream(stdOut.toByteArray())
            stdOut = new ByteArrayOutputStream()
            exec {
                standardInput = stdIn
                commandLine "C:\\OpenSSL-Win64\\bin\\openssl", "base64"
                standardOutput = stdOut
            }
            def hashString = stdOut.toString().trim()
            return hashString
        }
        catch (error) {
            return error.toString();
        }
    }
    

    然后,您可以在 Gradle 脚本中的任何位置打印结果。

    println "Facebook Release Key Hash: " + getFacebookHash()
    

    我将必要的详细信息保存在gradle.properties

    STORE_FILE=C:/Keystore.jks
    STORE_PASSWORD=password
    KEY_ALIAS=keystoreAlias
    KEY_PASSWORD=password
    

    【讨论】:

    • 使用你的答案发布散列键不同于使用@Tarun 的答案代码获取
    【解决方案7】:

    将此行添加到mainActivity.java

      @Override
     protected void onCreate(Bundle savedInstanceState) {
     super.onCreate(savedInstanceState);
    
     try {
     PackageInfo info = getPackageManager().getPackageInfo("**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 (PackageManager.NameNotFoundException e) {
     Log.e("KeyHash:", e.toString());
     } catch (NoSuchAlgorithmException e) {
     Log.e("KeyHash:", e.toString());
     }
    
     }
    

    【讨论】:

      【解决方案8】:
      1. 生成 sha1 并复制它
      2. 去这个网站http://tomeko.net/online_tools/hex_to_base64.php
      3. 复制输出(base64)

      【讨论】:

        【解决方案9】:

        为 android 项目生成 sha1 密钥

        转到 JDK bin dir 然后打开 cmd

        C:\Program Files\Java\jdk-9.0.1\bin>keytool -exportcert -alias androiddebugkey -keystore "C:\Users\pcUser\.android\debug.keystore" | "C:\Users\pcUser\Desktop\openssl-0.9.8d_X64\bin\openssl" sha1 -binary | "C:\Users\pcUser\Desktop\openssl-0.9.8d_X64\bin\openssl" base64
        

        下载 OpenSSL(如果需要)

        https://code.google.com/archive/p/openssl-for-windows/downloads

        【讨论】:

          【解决方案10】:

          对于调试,如果使用 Eclipse,您将需要使用 Android 调试密钥生成此密钥哈希。当您准备好发布您的应用程序时,您需要为您的签名密钥生成一个 Key Hash 并在 Facebook 中更新此值,然后您的签名应用程序才能运行。

          看看下面的链接

          Android Facebook SDK: How to generate a non-debug hash key?

          Do I need to add new key hash to Facebook app setting every time I change computer?

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多