我正在开发一款应用程序,需要支持 Facebook。我已经从原始的 Git 存储库中下载了 Facebook API 及其样本“Hackbook”。问题出在登录上 - 如果手机上没有安装原始的 FB 应用程序,则登录会通过自定义对话框进行,并且一切正常,但是如果安装了 FB 应用程序,Hackbook 会自动重定向到原始的 FB 应用程序,然后就无法登录了。我在五部不同的手机上测试过,问题总是一样。
我正在开发一款应用程序,需要支持 Facebook。我已经从原始的 Git 存储库中下载了 Facebook API 及其样本“Hackbook”。问题出在登录上 - 如果手机上没有安装原始的 FB 应用程序,则登录会通过自定义对话框进行,并且一切正常,但是如果安装了 FB 应用程序,Hackbook 会自动重定向到原始的 FB 应用程序,然后就无法登录了。我在五部不同的手机上测试过,问题总是一样。
我曾经遇到类似的问题。在我的情况下,我没有使用签名密钥创建哈希密钥。我只是使用了默认的debug.keystore签名密钥创建了一个哈希密钥。
一旦我使用应用程序发布签名密钥创建了一个哈希密钥,该问题就得到解决了。如果你还没有这样做,请使用你的签名密钥(用于上传到市场)创建一个新的哈希密钥,并将其添加到你的应用程序的 Facebook 控制面板中。
希望这对你有所帮助。
我辛苦了两天终于得到了解决方案,但是这种方法是错误的获取哈希密钥的方式 -
keytool -exportcert -alias *<your _alias_name>* -keystore *<key_store_path>* | [openssl_bin_directory]\openssl sha1 -binary | [openssl_bin_directory]\openssl base64
正确的方法是在命令提示符中逐行输入以下3行。在第一行之后,您将被要求插入密钥库密码。
keytool -exportcert -alias *<your _alias_name>* -keystore *<key_store_path>* > [openssl_bin_directory]\debug.txt
[openssl_bin_directory]\openssl sha1 -binary [openssl_bin_directory]\debug.txt > [openssl_bin_directory]\debug_sha.txt
[openssl_bin_directory]\openssl base64 -in [openssl_bin_directory]\debug_sha.txt > [openssl_bin_directory]\debug_base64.txt
LoginManager.getInstance().logOut();
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
获取密钥哈希之后,我成功地第一次以发布模式登录了...
然后第二次我遇到了常见的错误
Your key "*********real*key************"
does not match the allowed keys specified in your application settings."*********real*key************"
,我现在成功地以发布模式登录了。
因此,在输入此密钥时,请确保使用完全相同的密钥。字母 I,小写字母 L(即 l)会给你带来麻烦。我制作了两个密钥,第一个密钥我使用了小写字母 L(即 l),第二个密钥我使用了大写字母 I,并将这些密钥放置在开发人员应用程序中。private void calculateHashKey(String yourPackageName) {
try {
PackageInfo info = getPackageManager().getPackageInfo(
yourPackageName,
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) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
LoginManager.Instance.SetLoginBehavior(LoginBehavior.NativeOnly);