使用android studio时的facebook哈希键

我正在使用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需要的哈希键是否不同? 其中哪些是我正确的哈希键?

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

你为什么不尝试这个代码并检查你正在使用的哈希键。 来自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) { } } 

这是创建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(); } } } 

代码取自这里 。

只需在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(); } } 

假设您从openssl输出复制粘贴到Facebook应用程序设置,这样就不会出现类似外观字符O0或1l的混淆。 还是G6 ……

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

要在模拟器上运行,请访问http://rightparen.com/android/GetKeyHash.apk 。

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

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

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

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 

正如你所看到的…… theres 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= 

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

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 

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

看看下面的链接

Android Facebook SDK:如何生成非调试哈希密钥?

每次更换电脑时,是否需要在Facebook应用设置中添加新的密钥哈希?