Facebook SSO示例无法正常工作 - “发生错误。请稍后再试”。

6
我正在尝试将Facebook集成到我的应用程序中,因此按照Facebook Android的教程进行操作,但我无法使第一个示例(单点登录)正常工作。当我的应用程序加载时,我会看到Facebook对话框,但它只显示“发生错误。请稍后再试。”并带有一个Facebook风格的“确定”按钮,在logcat中没有任何内容:App showing Facebook error 我按照教程中的步骤进行操作,但我猜测APP ID或由keytool生成的hashkey存在问题。以下是我所遵循的步骤:
  1. 克隆fb git。
  2. 创建fbSDK项目。
  3. 创建自己的fb项目并将fbSDK链接为库。
  4. 然后我使用openssl执行了keytool cmd,并输入了建议在stackoverflow上输入的密码“android”。
  5. 我去developers.facebook.com创建了一个新应用程序。
  6. 在“编辑设置->移动设备”中,我将我的哈希放入提供的框中。
  7. 在“编辑设置->移动设备”中,我选择了“本机应用程序”作为“应用程序类型”
  8. 回到应用程序中,我复制并粘贴了SSO示例代码。
  9. 我将Facebook()构造函数中的“YOUR_APP_ID”更改为developers.facebokk.com页面上显示的新应用程序的APP ID。
  10. 我在手机上运行了应用程序。
我不知道为什么logcat中没有任何内容,但是当我安装它时,控制台总是不间断地显示:ActivityManager: Warning: Activity not started, its current task has been brought to the front 我找不到任何与我的应用程序或来自Facebook SDK的错误相关的logcat引用,该错误为:Facebook-ProxyAuth(4828): Failed to read calling package's signature. 我已经花费了几个小时的时间进行尝试,非常感谢您的帮助。我无法相信Facebook SDK和Android的帮助如此不靠谱,Facebook应该为此感到羞耻。
谢谢,
InfinitiFizz
5个回答

2

您需要从单独的线程调用 .request() 方法。如果在 UI 线程中执行此操作,则 Facebook 授权不会在您的代码执行之前完成。因此,请在 Facebook 授权的 "onComplete" 中调用新线程。此时,您将拥有有效的访问令牌。祝好运!

(这就是为什么 API 说 "不要从 UI 线程调用此方法!" 的原因。)


嗯,我不认为这是我的问题,因为我现在只是使用SDK显示的单点登录和OnFacebookError示例代码,无论我做什么,当authorize()运行时总是调用FacebookError,尽管它以前没有FacebookError,真烦人! - Infiniti Fizz

2
事实上,我也遇到了完全相同的问题,并成功解决了。 因此,在哈希密钥生成过程中,请按照以下步骤进行:
  1. 打开cmd并进入您的Android SDK路径。
  2. 键入以下命令: keytool -exportcert -alias androiddebugkey -keystore [your SDK path | e.g c:\users\user].android\debug.keystore | openssl sha1 -binary | openssl base64
  3. 之后会提示输入密码,请输入"android"
  4. 将结果复制到您的Facebook应用程序设置中并保存设置。
  5. 在您的Android应用程序中使用Facebook应用程序ID(而不是Android哈希密钥)。

1

我遇到了这个问题,只是因为在正确初始化Facebook对象之前,我就开始调用Facebook API。确保您使用正确的密钥并正确初始化Facebook对象即可。

此外,我也曾因尝试使用不同的Android应用程序密钥进行Facebook API调用而被绊倒。请记住,Facebook教程指导您使用已编译的apk创建密钥。如果您要从IDE(我正在使用Eclipse)运行代码,则此密钥哈希将不同。当您直接从eclipse运行应用程序时,Facebook密钥将不同,因为在从eclipse运行应用程序时,它使用默认发布密钥构建应用程序。

因此,我通常在Facebook开发人员门户中有两个密钥。一个密钥是使用用于Android市场的发布密钥编译的apk创建的,另一个密钥是从eclipse直接运行应用程序代码创建的。


0

正确找到哈希值的最佳方法是使用这段小代码:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    try {
        PackageInfo info = getPackageManager().getPackageInfo(
                "com.facebook.samples.loginhowto", 
                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.facebook.samples.loginhowto 替换为您自己的包名。


0

为什么在第7步选择了原生应用程序?我将其保留为默认的HTML5 / 移动Web,并使示例正常工作。


好的,我不知道为什么我改了它,我只是假设,因为我正在为Android创建一个应用程序,而不是使用浏览器的HTML5 / 移动Web应用程序。不过谢谢,我会试一下的。 - Infiniti Fizz
好的,我没有改变本地应用程序的东西,但它似乎可以工作,我成功使用应用程序发布到了我的墙上!唯一的问题是,发布到我的墙上是通过Facebook API对话框完成的,该对话框只会跳转到他们的Facebook页面进行发布。因此,我仍然无法获得API的本机使用,我尝试使用facebook.request("me")调用Graph API,但我只收到一个关于未使用活动访问令牌的Oauth错误,我完全被卡住了 :( - Infiniti Fizz
好的,我已经使用Web视图登录了(仍然无法解决愚蠢的SSO问题),并且我正在使用AsyncFacebookRunner调用request("me");但是每次尝试时,第一次安装应用程序时它会获取有关我的信息(耶!),但是之后每次都会收到“必须使用活动访问令牌来查询有关当前用户的信息。”,我应该在任何地方存储访问令牌还是每次尝试访问Graph API时都获取一个新的?谢谢。 - Infiniti Fizz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接