在我的一个应用程序中,我需要获取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");
}
答案 0 :(得分:259)
生成哈希键错误。您可以使用两个步骤获取哈希键。一个是通过命令提示符。另一个是通过编码。通过命令提示符仅在第一次处理时使用哈希键。我不知道原因。我也遇到了同样的问题。所以我以编程方式尝试了它。
请按照以下步骤操作:
将以下代码粘贴到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。 有关密钥哈希的更多详细信息,请查看link
如果在设置页面中添加错误信息,则表示会出现一些错误。所以在那里使用正确的信息。此外,如果公众(除您之外)需要使用您的应用程序,则意味着您需要启用权限(change "yes" in the "Status & Review" next to setting)
。
答案 1 :(得分:131)
在 Google Play控制台中打开应用程序签名部分,并获取应用程序签名证书的 SHA1 ,然后将其转换为 base64 < / strong>,例如使用此工具:http://tomeko.net/online_tools/hex_to_base64.php?lang=en
答案 2 :(得分:109)
如果您遇到此问题,请将此密钥放入developer.facebook.com
然后确保您的应用
实时此绿色圆圈表示应用已投放
如果不是,请按照以下两个步骤使您的应用程序生效
第1步:转到您的应用程序 - &gt; 设置 =&gt;和添加联系电子邮件并应用保存更改
Setp 2 然后转到 App Review 选项并确保此切换为是,我添加了一个屏幕截图
注意:如果要复制hashkey,请检查Logcat中的BlueServiceQueue。
答案 3 :(得分:70)
我遇到了同样的问题。我确信这是由于非常小的故障,是的,它是!!!! 我找到了解决方案。
在我的计算机中生成 debug 哈希密钥时,我输入了系统密码。但密码应为以下内容 -
输入密钥库密码:&#34; android&#34;
这是我个案中唯一的问题。
-----要生成 Debug 键哈希,请使用此命令 -
keytool -exportcert -alias androiddebugkey -keystore~ / .android / debug.keystore | openssl sha1 -binary | openssl base64
输入密钥库密码:&#39; android&#39;
-----要生成 发布 密钥哈希,请使用此命令 -
keytool -exportcert -alias&#34;密钥库的别名&#34; -keystore&#34;签署应用程序时的密钥库路径&#34; | openssl sha1 -binary | openssl base64
执行此命令后提供密钥库密码。
答案 4 :(得分:21)
我遇到了同样的问题。我对这种奇怪行为的可能原因做了一个简短的研究,我发现了以下内容:
在首次执行新的Facebook应用程序时,即使您没有指定任何密钥哈希值,也会允许连接/登录。
对我来说,Facebook提供的教程没有生成正确的密钥哈希,因为它提供了错误的配置。执行时:
function checkLocation() {
//geolocation API options
var options = {
maximumAge: 5 * 60 * 1000,
enableHighAccuracy: true,
timeout: 20000};
//success getting the geolocation
function success(ppos) {
lat = ppos.coords.latitude;
lng = ppos.coords.longitude;
codeLatLng(lat, lng);
}
//error when getting the geolocation
function error(err) {
var errorMessage = "Error:";
switch(err.code) {
case err.TIMEOUT:
errorMessage = 'Error: Attempts to retrieve location timed out.';
break;
case err.POSITION_UNAVAILABLE:
errorMessage = "Error: Your browser doesn't know where you are.";
break;
case err.PERMISSION_DENIED:
errorMessage = 'Error: You have to give us permission!';
break;
case err.UNKNOWN_ERROR:
errorMessage = 'Error: Unknown error returned.';
break;
default:
errorMessage = 'Error: ' + err + ' ' + err.code;
}
}
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(success, error, options);
}
}
function codeLatLng(lat, lng) {
var lat = parseFloat(lat);
var lng = parseFloat(lng);
var latlng = new google.maps.LatLng(lat, lng);
geocoder.geocode({'latLng': latlng}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
if (results[1]) {
return results[1].formatted_address;
} else {
alert('No results found');
}
} else {
alert('Geocoder failed due to: ' + status);
}
});
}
确保检查所有属性 - keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl
base64
,密钥库的存在等。也许您还必须提供密码。
生成正确配置的是@Mahendran 建议的解决方案。
此外,如果您看到最初发布的错误(http://i.stack.imgur.com/58q3v.png),则很可能您在屏幕上看到的密钥哈希是真实的。如果没有其他工作,尝试在Facebook上输入它。
我得到了所有这些结果:Windows 7 64位版本,Android Studio 1.2.2,JDK 7.
答案 5 :(得分:12)
根据Facebook Login for Android,您必须提供Key Hash值。要获得它,您需要使用key来签署您的申请。
keytool \
-exportcert \
-alias YourKeyAlias \
-storepass YourStoreKeyPassword \
-keystore PathToYourKeyStoreFile | openssl sha1 -binary | openssl base64
答案 6 :(得分:7)
我尝试了以上所有内容,并没有对我的客户有所帮助! 比我的客户记得他在他的设备上安装了Facebook App。 删除后,登录工作完美。 该hashkey已被更改,我已使用错误中的密钥(如上所述)替换了Facebook开发者控制台上的旧哈希键,并且它可以正常工作! Facebook应用程序本身可能是问题所在,所以你最好在安装了Facebook应用程序的设备上以及未安装Facebook应用程序的设备上解决这个问题并处理这两种情况。
答案 7 :(得分:6)
您必须为Debug创建一个键哈希值,为Release释放一个哈希键。
对于调试密钥哈希:
在OS X上,运行:
keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
在Windows上,运行:
keytool -exportcert -alias androiddebugkey -keystore %HOMEPATH%\.android\debug.keystore | openssl sha1 -binary | openssl
base64
对于发布密钥哈希:
在OS X上,运行:(在&lt;&gt;之间替换您的值)
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
在Windows上,使用:(将&lt;&gt;之间的内容替换为您的值)
keytool -exportcert -alias <RELEASE_KEY_ALIAS> -keystore <RELEASE_KEY_PATH> | openssl sha1 -binary | openssl base64
答案 8 :(得分:3)
我遇到了同样的问题。 首次登录,很好,但随后是无效的密钥哈希。
即使这不是Unity线程,我在这里找到了答案。所以我会留下我的答案,以防其他人(像我一样误入歧途)偶然发现它。
用于Unity的Facebook SDK获取错误的密钥哈希。它从“C:\ Users \”获取用户“.android \ debug.keystore”的密钥,并且在完美的世界中,它应该从您在项目中创建的密钥库中获取它。这就是它告诉你密钥哈希没有注册的原因。
根据Madi的建议,您可以按照此link上的步骤找到正确的密钥。只需将shure指向项目内的密钥库,否则您将无法获得正确的密钥。
答案 9 :(得分:3)
此代码将为您提供Facebook的哈希值,但您必须按照这些步骤才能获得发布的condidate哈希值。 1.将此代码复制并粘贴到您的mainactivity中
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) {
}
通过手动将发布apk移至手机,在手机中安装并运行apk。
现在看一下android logcat(使用过滤器KeyHash :)你应该看到你的facebook版本哈希密钥。只需将其复制并粘贴到https://developers.facebook.com/apps设置下即可。
现在你可以测试它应该能够很好地运行的应用程序。
祝你好运。答案 10 :(得分:2)
经过长时间的研究,我们找到了解决方案。
我们将权限设置为:
loginButton.setReadPermissions(public_profile email);
这是第一次使用,但是当我们重新登录到FB时,它会产生无效的哈希错误。
简单的解决方案是将上述行更改为:
loginButton.setReadPermissions(Arrays.asList( "public_profile", "email"));
它就像幸福一样!
希望这有助于某人。
Facebook应该返回正确的异常,而不是误导性的无效散列键错误。
答案 11 :(得分:1)
即使以多种有用的方式回答了这个问题,我只是想补充一点,当我按照Rafal Maleks的回答(使用Google Play控制台上的哈希键)时,我不能使用App Signing SHA1密钥仍然从Facebook收到一般错误。相反,我需要使用上传证书部分中的SHA-1证书指纹(位于Google Play控制台上“应用签名”部分的下方)。否则相同的过程;
从Google Play控制台的上传证书部分复制SHA-1证书指纹
使用http://tomeko.net/online_tools/hex_to_base64.php转换SHA-1并复制输出(base64)
将其粘贴到developer.facebook.com上的“密钥哈希”输入中并保存更改。
希望这个答案不是多余的,它将帮助无法使用它的人使用App Signing证书。
现在,Facebook登录在调试和发布模式下均可在我的应用程序中使用。
答案 12 :(得分:1)
这就是我解决这个问题的方式
首先,您必须获取SHA-1值。为此,有两种方法。
->要在Android Studio中获取SHA-1值。
或 ->要从 keystore 文件获取SHA-1值。
keytool -list -v -keystore keystore_file_name.jks -alias key0
将 SHA1 值复制到剪贴板
像这样CD:A1:EA:A3:5C:5C:68:FB:FA:0A:6B:E5:5A:72:64:DD:26:8D:44:84
并打开http://tomeko.net/online_tools/hex_to_base64.php将SHA1值转换为base64。
这就是Facebook的要求
获取生成的哈希值“ ******************** =”,并将密钥哈希值复制到facebook应用程序。
答案 13 :(得分:1)
如果您正在手动键入密钥哈希(例如,从Mobile到Facebook Dashboard),请确保区分小写L和大写字母I。
答案 14 :(得分:1)
对我有用的唯一解决方案是从谷歌卸载OpenSSL程序并从http://slproweb.com/products/Win32OpenSSL.html下载
它真的像魔术一样
答案 15 :(得分:1)
我在调试应用时遇到了同样的问题。我重写了你在附加图片中划掉的哈希值(Facebook说的那个无效),并在Facebook的开发者控制台中将其添加到关键哈希中。在拼写错误时要小心。
这种解决方案更像是简单的解决方案而不是正确的解决方案。
答案 16 :(得分:1)
这可能会帮助一个有同样问题的人
keytool -exportcert -alias <your_keystore> alias -keystore <your_keystore_file> | openssl sha1 -binary | openssl base64
2.将其粘贴到facebook developer
中的必填字段中 3.在android studio File-&gt; Project Structure
添加签名参数
选择我们创建的签名配置
6.选择构建变量并构建它
答案 17 :(得分:1)
将以下代码粘贴到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) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
只需修改包名称。然后转到Log cat并在此处选择Debug search,然后您将找到哈希键。现在复制此哈希键,然后转到developer.facebook.app_id站点,然后编辑您的哈希键,然后按save。现在再次运行你的android项目我认为问题将得到解决。
答案 18 :(得分:0)
这里的家伙有很多正确的答案。就一件事。将收到的哈希粘贴到应用程序 - &gt;设置 - &gt;主要不通过快速入门教程。
答案 19 :(得分:0)
facebook使用的不是默认密码和调试别名。你需要改变它,它会起作用。
div = tree.xpath("//*[@id='ANALYSIS']")[0]
如果您没有使用默认密码更改任何内容,则应该是android。 您也可以在build.gradle文件中对其进行配置。但是应该使用相同的别名密码来生成哈希。
/usr/lib/jvm/jdk1.8.0_66/bin/keytool -exportcert -alias androiddebugkey -keystore ~/.android/debug.keystore | openssl sha1 -binary | openssl base64
答案 20 :(得分:0)
有同样的问题。 确保您使用生成存储在Facebook开发人员部分中的哈希键的设备来构建APK。
答案 21 :(得分:0)
我通过将以下内容添加到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");
}
然后我将其上传到Google开发者控制台,然后下载派生的 APK,无论出于何种原因,该APK的密钥哈希值都完全不同。
然后我使用logcat来确定新的密钥哈希,并在其他用户概述的情况下将其添加到facebook。
答案 22 :(得分:0)
这对我有用。
将APK复制到Program Files \ java \ jdkX.X.X_XXX \ bin文件夹中的PC中
在我的情况下是C:\ Program Files \ Java \ jdk1.8.0_191 \ bin
在此目录中打开CMD并输入以下内容
keytool -list -printcert -jarfile YOUR_APK_NAME.apk
将SHA1值复制到剪贴板
将会是这样的:
79:D0:E6:80:4E:28:1E:D1:88:28:CB:D7:E6:BE:2E:0C:FB:24:98:52
然后转到http://tomeko.net/online_tools/hex_to_base64.php将SHA1值转换为base64。
这是Facebook的要求 获取生成的哈希值“ ******************** =”并将密钥哈希值复制到您的Facebook开发人员应用设置。
答案 23 :(得分:0)
try {
PackageInfo info = getPackageManager().getPackageInfo(
"www.icognix.infomedia",
PackageManager.GET_SIGNATURES);
for (Signature signature : info.signatures) {
MessageDigest md = MessageDigest.getInstance("SHA");
md.update(signature.toByteArray());
Log.d("YourKeyHash :", Base64.encodeToString(md.digest(), Base64.DEFAULT));
Log.d("YourKeyHash: ", Base64.encodeToString(md.digest(), Base64.DEFAULT));
}
} catch (PackageManager.NameNotFoundException e) {
} catch (NoSuchAlgorithmException e) {
}
答案 24 :(得分:0)
如果要生成发布密钥哈希,请确保输入密钥存储区的实际密码,并且不是“ android”。
这是我的问题。调试版本可以正常工作,但APK版本却无法正常工作。
答案 25 :(得分:-1)
在活动的onCreate()方法中使用以下代码
try {
PackageInfo info = getPackageManager().getPackageInfo(
"your application package name",
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) {
}
运行此代码,这将生成Hash密钥。在Facebook应用程序设置中复制此KeyHash - &gt;保存更改。然后登录您的应用程序。这也将在未来完美运作。