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

时间:2013-09-04 06:34:44

标签: android facebook facebook-graph-api

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

关注此链接并完成所有这些操作:so : 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());
}

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

5 个答案:

答案 0 :(得分:10)

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

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

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

    P.S。我在我的问题中发布的方法实在没用。它只会让我迷惑不解。

答案 1 :(得分: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和正确的应用程序而无需更改任何内容!!

答案 2 :(得分: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

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

答案 3 :(得分: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

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

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

答案 4 :(得分:0)

在create method

上尝试以下代码
 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) {

    }