我完全不明白这个过程。我已经能够导航到Java SDK中包含keytool的文件夹。虽然我一直得到错误openssl不识别为内部或外部命令。问题是,即使我能让它工作,我该做什么,然后做什么?


当前回答

自从API 26以来,你可以在KOTLIN中使用以下代码生成你的HASH key,而不需要任何Facebook SDK。

fun generateSSHKey(context: Context){
    try {
        val info = context.packageManager.getPackageInfo(context.packageName, PackageManager.GET_SIGNATURES)
        for (signature in info.signatures) {
            val md = MessageDigest.getInstance("SHA")
            md.update(signature.toByteArray())
            val hashKey = String(Base64.getEncoder().encode(md.digest()))
            Log.i("AppLog", "key:$hashKey=")
        }
    } catch (e: Exception) {
        Log.e("AppLog", "error:", e)
    }

}

其他回答

我也遇到了同样的问题,下面是我如何解决它的方法

keytool -list -alias androiddebugkey -keystore <project_file\android\app\debug.keystore>

如果你已经将应用程序上传到Play商店,你可以生成哈希密钥如下:

点击这里进入发布管理 选择“发布管理->应用签名” 你可以看到SHA1密钥十六进制格式的App签名证书。 复制十六进制格式的SHA1,并将其转换为base64格式,你可以使用这个链接做到没有SHA1:十六进制的一部分。 转到Facebook开发者控制台,在设置- > basic - > key哈希值中添加键(转换为base64后)。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    
    // Add code to print out the key hash
    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.facebook.samples.hellofacebook", 
                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) {
        
    }
    
    ...

保存更改并重新运行示例。检查你的logcat输出是否有类似这样的消息:

D/KeyHash:(936): 478uEnKQV+fMQT8Dy4AKvHkYibo=

将密钥哈希保存在开发人员配置文件中。重新运行示例并验证可以成功登录。

下载open ssl:

然后将openssl\bin添加到路径系统变量中:

我的电脑->属性->高级配置->高级->系统变量->系统变量下查找路径,并将此添加到其结尾: ; yourFullOpenSSLDir \ bin

现在在你的jdk\bin文件夹C:\Program Files\Java\ jdk1.8.0_40\bin上打开一个命令行(在windows上按住shift并右键单击->打开命令行此处),并使用:

keytool -exportcert -alias keystorealias -keystore C:\yourkeystore\folder\keystore.jks | openssl sha1 -binary | openssl base64

并复制它在给出密码后生成的长度为28的数字。

这就是我如何获得我的:

private class SessionStatusCallback implements Session.StatusCallback {
        @Override
        public void call(Session session, SessionState state, Exception exception) {

            if (exception != null) {
                new AlertDialog.Builder(FriendActivity.this)
                        .setTitle(R.string.login_failed_dialog_title)
                        .setMessage(exception.getMessage())
                        .setPositiveButton(R.string.ok_button, null)
                        .show();
            }

因此,当您试图在没有密钥的情况下输入时,将会出现异常。Facebook在这个例外中加入了RIGHT键。你所要做的就是复制它。