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


当前回答

在你的应用程序中运行:

FacebookSdk.sdkInitialize(getApplicationContext());
Log.d("AppLog", "key:" + FacebookSdk.getApplicationSignature(this)+"=");

或:

public static void printHashKey(Context context) {
    try {
        final PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);
        for (android.content.pm.Signature signature : info.signatures) {
            final MessageDigest md = MessageDigest.getInstance("SHA");
            md.update(signature.toByteArray());
            final String hashKey = new String(Base64.encode(md.digest(), 0));
            Log.i("AppLog", "key:" + hashKey + "=");
        }
    } catch (Exception e) {
        Log.e("AppLog", "error:", e);
    }
}

然后看看日志。

结果应该以“=”结尾。

解是基于这里和这里。

其他回答

    @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=

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

https://developers.facebook.com/docs/android/getting-started/

4.19.0 - 2017年1月25日

Facebook SDK

修改

Facebook SDK现在在应用程序启动时自动初始化。在大多数情况下,不再需要手动调用FacebookSDK.sdkInitialize()。有关详细信息,请参见升级指南。

为调试

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

我遇到了完全相同的问题,我没有被要求提供密码,而且似乎我的密钥库文件路径错误。

事实上,如果keytool没有找到您设置的密钥存储库,它将创建一个密钥存储库,并提供错误的密钥,因为它没有使用正确的密钥。

一般的规则是,如果你没有被要求输入密码,那么你生成了错误的密钥。

Linux和Mac

开放式终端:

用于调试构建

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64

你会发现调试。中的密钥存储库。android”文件夹。复制并粘贴到桌面上,然后运行上面的命令。

发布版本

keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64

注意:确保在这两种情况下它都要求输入密码。如果它不要求输入密码,则意味着命令中有错误。调试密码。密钥存储库是“android”,为了发布,您必须输入您在创建密钥存储库时设置的密码。

keytool -exportcert -alias androiddebugkey -keystore “C:\Users**Deepak**.android\debug.keystore” |“C:\Users\Deepak\ssl\bin\openssl” sha1 -binary |“C:\Users\Deepak\ssl\bin\openssl” base64

2上述命令的变化 1.Deepak===替换为您的系统用户名 2.C:\Users\Deepak\ssl===替换您的Open ssl路径

运行此命令并获得如下输出

C:\Users\Deepak>keytool -exportcert -alias androiddebugkey -keystore "C:\Users\D eepak.android \调试。keystore" | "C:\Users\Deepak\ssl\bin\openssl" sha1 -二进制 | "C:\Users\Deepak\ssl\bin\openssl" base64 输入keystore密码:****** ga0RGNY ******************=