Facebook使用发布密钥登录Android应用程序

iSm*_*ita 2 android facebook facebook-graph-api

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

按照这个链接,并做了所有这些方法:所以:key-hash-for-android-facebook-app

我改变了机器,我改变了平台(windows和mac osx ML)以获得解决方案,但同样的问题.它没有登录.当我使用debug.keystore时,下面的代码给了我正确的哈希键,当我使用不同的密钥签署应用程序时,我得到相同的Hashkey(我在得到很多试验之后得出结论,我得到的密钥是错的)

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());
}
Run Code Online (Sandbox Code Playgroud)

因此,在使用发布密钥对应用程序进行签名时,我们需要采取哪些额外步骤.请帮忙.

iSm*_*ita 10

以下是我所做的解决问题的方法:

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

我改用了这个:

keytool -exportcert -alias <aliasNameUseInReleaseKeystore> -keystore <ReleasekeystoreFilePath> | openssl sha1 -binary | openssl base64
Run Code Online (Sandbox Code Playgroud)

PS我在我的问题中发布的方法真的没用.它只会让我迷惑不解.

  • 使用openssl-0.9.8e_WIN32解决了我的问题.谢谢 :) (2认同)

Jos*_*ita 7

我找到了一个管理调试和发布环境的出色解决方案.

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

keytool -exportcert -alias androiddebugkey -keystore c:\Users\YourUser\.android\debug.keystore | openssl sha1 -binary | openssl base64
Run Code Online (Sandbox Code Playgroud)

这一个发布:

keytool -exportcert -alias "yourAliasUsedWhenYouGeneratedTheKey" -keystore "C:\Users\YourUser\AppData\Local\Android\android-studio\key.jks" | openssl sha1 -binary | openssl base64
Run Code Online (Sandbox Code Playgroud)

2.转到Facebook应用程序并创建两个应用程序,一个"您的应用程序"和其他"您的应用程序(调试)".然后将调试哈希分配给调试应用程序,并将释放哈希分配给普通应用程序(显而易见).

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

<string name="app_id">123456789</string>
<string name="app_id_debug">987654321</string>
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

这样你就可以在每个环境中使用正确的appId和正确的应用程序,而无需改变任何东西!


Bir*_*dia 6

对于Linux

开放式终端:

对于Debug Build

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
Run Code Online (Sandbox Code Playgroud)

您将从".android"文件夹中找到debug.keystore,将其从桌面复制并粘贴到桌面上并运行上面的命令

发布版本

keytool -exportcert -alias <aliasNameUseInReleseKeystore> -keystore <RelesekeystoreFilePath> | openssl sha1 -binary | openssl base64
Run Code Online (Sandbox Code Playgroud)

注意:确保在两种情况下都必须要求输入密码.如果它没有要求输入密码,则意味着命令出错.