在我的一个应用程序中,我需要从Facebook获取数据…我是这样做的:
我已经创建了应用ID。它成功登录,但注销后,我登录,然后它给我:
我做错了什么?我正在使用Facebook SDK…我已经在手机上安装了Facebook。它在模拟器中运行良好,但没有安装内置的Facebook应用程序。
这是我的代码:
if (FB_APP_ID == null) {
Builder alertBuilder = new Builder(this);
alertBuilder.setTitle("Warning");
alertBuilder.setMessage("A Facebook Applicaton ID must be " +
"specified before running this example: see App.java");
alertBuilder.create().show();
}
// Initialize the dispatcher
Dispatcher dispatcher = new Dispatcher(this);
dispatcher.addHandler("login", LoginHandler.class);
dispatcher.addHandler("stream", StreamHandler.class);
dispatcher.addHandler("logout", LogoutHandler.class);
// If a session already exists, render the stream page
// immediately. Otherwise, render the login page.
Session session = Session.restore(this);
if (session != null) {
dispatcher.runHandler("stream");
}
else {
dispatcher.runHandler("login");
}
我看到很多人给出了困难的答案,通过我解决我的问题的答案只是去项目/android文件夹/应用程序使用终端,这是你调试的地方。Keystore文件为
keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
复制粘贴这个命令,替换你的项目/android/app/build.gradle中的别名和密码
debug {
storeFile file('debug.keystore')
storePassword 'android'
keyAlias 'androiddebugkey' <---- alias
keyPassword 'android' <---- password
}
我通过在MainApplication.onCreate中添加以下内容来修复这个问题:
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.genolingo.genolingo",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
String hash = Base64.encodeToString(md.digest(), Base64.DEFAULT);
KeyHash.addKeyHash(hash);
}
}
catch (PackageManager.NameNotFoundException e) {
Log.e("PackageInfoError:", "NameNotFoundException");
}
catch (NoSuchAlgorithmException e) {
Log.e("PackageInfoError:", "NoSuchAlgorithmException");
}
然后我将其上传到谷歌开发人员控制台,然后下载了派生的APK,无论出于什么原因,它具有完全不同的键散列。
然后我使用LogCat来确定新的密钥散列,并将其添加到Facebook,就像其他用户所概述的那样。
生成的哈希键错误。您可以通过两个步骤获得哈希键。
一种是通过命令提示符。另一个是通过编码。通过命令提示符的散列键仅在第一次工作。我不知道原因。我也有同样的问题。所以我试着通过编程来实现。
遵循以下步骤:
将以下代码粘贴到oncreate()中。
try {
PackageInfo info = getPackageManager().getPackageInfo(
"com.example.packagename",
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) {
}
修改com . example。”packagename”与你的包名在上面的编码中没有失败(你可以在Android manifest文件中找到你的包名)。
运行应用程序。转到您粘贴上述代码的活动。在LogCat文件中,搜索“KeyHash”。你可能会找到一个键散列。复制键哈希和去Facebook应用仪表板页面。进入设置并输入如下图所示的详细信息。
完成上述步骤后,再次重新启动应用程序。你现在可以登录Facebook了。
有关key hash的更多详细信息,请查看链接。
如果你在设置页面中添加了错误的信息,这意味着它会给出一些错误。所以要使用正确的信息。此外,如果公众(除您之外)需要使用您的应用程序,则意味着您需要启用权限(在设置旁边的“状态和审查”中更改“是”)。
我也遇到过同样的问题。我对这种奇怪行为的可能原因做了一个简短的研究,我发现了以下几点:
在一个新的Facebook应用程序的第一次执行期间,即使你没有指定任何键哈希,它也将允许连接/登录。
对我来说,Facebook提供的教程没有生成正确的键散列,因为它给出了错误的配置。当执行:
keytool -exportcert -alias androiddebugkey -keystore % home路径%\.android\调试。Keystore | openssl sha1 -binary | openssl . Keystore | openssl sha1 -binary | openssl . Keystore
base64
确保检查了所有属性——HOMEPATH、密钥库的存在等等。可能还需要提供密码。
生成正确配置的是@Mahendran建议的解决方案。
此外,如果您看到最初发布的错误(http://i.stack.imgur.com/58q3v.png),那么您在屏幕上看到的键散列很可能就是您的真实键散列。如果其他方法都不管用,试试把它输入Facebook。
我得到了所有这些结果:Windows 7 64位版本,Android Studio 1.2.2, JDK 7。