2

我正在尝试在 Google Play 上发布我的应用程序。我的应用中有 Facebook 登录。直到昨天,一切都运行良好,直到我使用debug.keystore. 但是当我使用自己的发布密钥并签署我的应用程序时,Facebook 没有登录,我似乎无法弄清楚原因。

按照这个链接,也做了所有的事情:所以:key-hash-for-android-facebook-app

我更换了机器,也更换了平台(windows 和 mac osx ML)以获得解决方案,但同样的问题。它没有登录。下面的代码在我使用 debug.keystore 时为我提供了正确的哈希密钥,当我使用不同的密钥签署应用程序时,我得到相同的哈希密钥(经过大量试验,我得出的结论是我得到的密钥是错误的)

PackageInfo info;
try {
    info = getPackageManager().getPackageInfo("com.you.name", PackageManager.GET_SIGNATURES);
    for (Signature signature : info.signatures) {
        MessageDigest md;
        md = MessageDigest.getInstance("SHA");
        md.update(signature.toByteArray());
        String something = new String(Base64.encode(md.digest(), 0));
        //String something = new String(Base64.encodeBytes(md.digest()));
        Log.e("hash key", something);
    }
} catch (NameNotFoundException e1) {
    Log.e("name not found", e1.toString());
} catch (NoSuchAlgorithmException e) {
    Log.e("no such an algorithm", e.toString());
} catch (Exception e) {
    Log.e("exception", e.toString());
}

那么在使用发布密钥对应用程序进行签名时,我们是否需要采取任何额外的步骤。请帮忙。

4

5 回答 5

10

这是我解决问题的方法:

  1. 使用 openssl-0.9.8e_WIN32 而不是 openssl-0.9.8k_WIN32
  2. 我没有在下面使用别名,或者我在别名中输入了一个空格,因此生成的密钥是错误的。

我改用这个:

keytool -exportcert -alias <aliasNameUseInReleaseKeystore> -keystore <ReleasekeystoreFilePath> | openssl sha1 -binary | openssl base64

PS我在我的问题中发布的方法真的没用。它只会让我无所适从。

于 2013-09-04T11:18:26.830 回答
7

我找到了一个很棒的解决方案来管理调试和发布环境。

1.生成两个哈希值,使用以下命令进行调试:

keytool -exportcert -alias androiddebugkey -keystore c:\Users\YourUser\.android\debug.keystore | openssl sha1 -binary | openssl base64

而这个发布:

keytool -exportcert -alias "yourAliasUsedWhenYouGeneratedTheKey" -keystore "C:\Users\YourUser\AppData\Local\Android\android-studio\key.jks" | openssl sha1 -binary | openssl base64

2.转到 Facebook 应用程序并创建两个应用程序,一个“您的应用程序”和另一个“您的应用程序(调试)”。然后将调试哈希分配给调试应用程序,将发布哈希分配给普通应用程序(很明显)。

3.获取两个Application Id并以这种方式将它们写入strings.xml文件中:

<string name="app_id">123456789</string>
<string name="app_id_debug">987654321</string>

4.最后,在您的代码中,以编程方式在您的 Facebook 登录片段中注册 appId:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    uiHelper = new UiLifecycleHelper(getActivity(), callback);
    uiHelper.onCreate(savedInstanceState);

    String appId;

    try {
        ApplicationInfo appinfo = getActivity().getPackageManager().getApplicationInfo(getActivity().getPackageName(), 0);
        boolean isDebugMode = (0 != (appinfo.flags &= ApplicationInfo.FLAG_DEBUGGABLE));

        if (isDebugMode)
            appId = getString(R.string.app_id_debug);
        else
            appId = getString(R.string.app_id);
    } catch (PackageManager.NameNotFoundException e) {
        appId = getString(R.string.app_id);
    }

    Session session = new Session.Builder(getActivity().getBaseContext()).setApplicationId(appId).build();
    Session.setActiveSession(session);

    return inflater.inflate(R.layout.fragment_facebook_login, container, false);
}

这样,您将在每个环境中使用正确的 appId 和正确的应用程序,而无需更改任何内容!!

于 2014-02-28T07:08:16.637 回答
6

对于 Linux

打开终端:

用于调试构建

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

你会从“.android”文件夹中找到debug.keystore复制它并粘贴到桌面上并运行上面的命令

对于发布构建

keytool -exportcert -alias <aliasNameUseInReleseKeystore> -keystore <RelesekeystoreFilePath> | openssl sha1 -binary | openssl base64

注意:确保在这两种情况下都必须要求输入密码。如果它不要求输入密码,则意味着命令有问题。

于 2013-09-04T06:49:14.823 回答
2

这是我解决问题的方法:

从这里使用 openssl-0.9.8e_WIN64 而不是 openssl-0.9.8k_WIN64

keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | PATH_TO_OPENSSL_LIBRARY\bin\openssl sha1 -binary | PATH_TO_OPENSSL_LIBRARY\bin\openssl base64

例子 :

keytool -exportcert -alias "yourAliasKey" -keystore "C:\Users\YourUser\AppData\Local\Android\android-studio\key.jks" | PATH_TO_OPENSSL_LIBRARY\bin\openssl sha1 -binary | PATH_TO_OPENSSL_LIBRARY\bin\openssl base64

使用您的 playstore 密钥库别名作为 RELEASE_KEY_ALIAS 及其保存的路径,文件名为 RELEASE_KEY_PATH。

注意:如果要求输入密码,请使用您的 playstore 密钥库密码。

于 2018-02-07T11:24:56.440 回答
0

在创建方法中尝试以下代码

 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.i("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT));//will give developer key hash
            Toast.makeText(getApplicationContext(),Base64.encodeToString(md.digest(), Base64.DEFAULT), Toast.LENGTH_LONG).show(); //will give app key hash or release key hash

            }
    } catch (NameNotFoundException e) {

    } catch (NoSuchAlgorithmException e) {

    }
于 2014-09-16T12:01:58.147 回答