在设备上安装Facebook应用程序时,SSO(单点登录)无法正常工作

时间:2013-08-24 06:56:48

标签: android facebook

我正在开发一款与facebook集成的Android应用。当我设置LoginButton.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO)时,该应用程序完全正常。

当我尝试使用SSO时出现问题。我收到以下错误。当我使用不正确的keyhash时,我曾经遇到类似的错误;事实并非如此,因为Webview登录工作正常。更令人惊讶的是,如果应用程序安装在FB中,Android应用程序可以正常运行。例如,我是应用程序管理器,因此它默认安装在我的Facebook个人资料中,但是当我尝试使用另一个没有安装该应用程序的fb帐户时,它不起作用。当我尝试登录时出现下面的错误,我得到一个对话框,告诉我将授予基本权限,但实际上我甚至没有获得基本权限。

我已提交该应用以供审核,以便在应用中心展示。当我这样做时,对话框显示一个复选框,我确认我的应用程序使用SSO。在我使用SSO之前,facebook是否需要批准我的应用程序(如果是这样,这没有意义)

我花了好几个小时试图解决这个问题,但我找不到解决方案。请帮忙。

08-24 01:39:16.058: W/Bundle(21880): Key com.facebook.platform.protocol.PROTOCOL_VERSION expected String but value was a java.lang.Integer.  The default value <null> was returned.
08-24 01:39:16.068: W/Bundle(21880): Attempt to cast generated internal exception:
08-24 01:39:16.068: W/Bundle(21880): java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.String
08-24 01:39:16.068: W/Bundle(21880):    at android.os.Bundle.getString(Bundle.java:1069)
08-24 01:39:16.068: W/Bundle(21880):    at android.content.Intent.getStringExtra(Intent.java:4350)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.AuthorizationClient.tryNextHandler(AuthorizationClient.java:238)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.AuthorizationClient$GetTokenAuthHandler.getTokenCompleted(AuthorizationClient.java:772)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.AuthorizationClient$GetTokenAuthHandler$1.completed(AuthorizationClient.java:731)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.internal.PlatformServiceClient.callback(PlatformServiceClient.java:144)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.internal.PlatformServiceClient.handleMessage(PlatformServiceClient.java:128)
08-24 01:39:16.068: W/Bundle(21880):    at com.facebook.internal.PlatformServiceClient$1.handleMessage(PlatformServiceClient.java:54)
08-24 01:39:16.068: W/Bundle(21880):    at android.os.Handler.dispatchMessage(Handler.java:99)
08-24 01:39:16.068: W/Bundle(21880):    at android.os.Looper.loop(Looper.java:137)
08-24 01:39:16.068: W/Bundle(21880):    at android.app.ActivityThread.main(ActivityThread.java:5227)
08-24 01:39:16.068: W/Bundle(21880):    at java.lang.reflect.Method.invokeNative(Native Method)
08-24 01:39:16.068: W/Bundle(21880):    at java.lang.reflect.Method.invoke(Method.java:511)
08-24 01:39:16.068: W/Bundle(21880):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
08-24 01:39:16.068: W/Bundle(21880):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
08-24 01:39:16.068: W/Bundle(21880):    at dalvik.system.NativeStart.main(Native Method)

5 个答案:

答案 0 :(得分:16)

我有一个类似的logcat输出,发现它与FB 3.5源代码中的不正确有关。如上所述,它位于AuthorizationClient.java的第821行。应该有 getIntExtra 而不是 getStringExtra 。 从github下载源代码并更改

intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));

""+intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));

答案 1 :(得分:3)

问题是hashkey是wong

适用于Linux

打开终端:

用于调试版本

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64

您将从“.android”文件夹中找到 debug.keystore 从中复制并粘贴到桌面上并在命令上方运行

发布版本

keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64

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

答案 2 :(得分:3)

好的,这是发生的事情。在我的onCreate()上,我将“create_event”和“publish_actions”权限传递给了我的LoginButton。我继续在LoginButton上设置一个onErrorListener,我得到了这个:

08-28 14:06:01.679: E/FACEBOOK LOGIN ERROR(28293): UnknownError: The app must ask for a basic_info permission at install time.

事实证明,安装后,您的应用 HAS 首先请求读取权限,一旦您登录,您可以要求发布权限。 Here是Facebook解释它的方式(在发布权限下):

  

应用应该将读取和发布权限请求分开。计划您的应用程序请求最低限度的读取权限   在初始登录时,然后在一个人的任何发布权限   实际上需要它们,例如当他们想要创建一个Open时   应用程序内的图形故事。这提供了最好的用户   体验并优化转化。

     

如果您的应用请求读取和发布权限,则可能会收到开发者提醒。要停止接收这些警报,   将您的要求分开或按照以下指南进行例外处理   例。

     

在极少数情况下,您的应用需要预先发布权限(例如,除了发布用户心情之外什么都不做的应用   Facebook),首先请求最初的最低读取权限   登录。用户使用Facebook登录后,向用户显示一个屏幕   解释为什么您的应用需要发布权限并让用户   通过单击按钮选择加入发布权限请求。这个   将为用户提供更多背景信息并改善您的转化。

     

请求读取和发布权限背靠背的另一个合法案例是用户登录您的应用程序   电子邮件或非Facebook登录选项。当这些用户想要发布时   到Facebook,您的应用需要请求读取权限才能连接   他们的帐户后面是背靠背发布权限。在这   例如,确保您请求的唯一读取权限是公开的   个人资料和朋友列表。这提供了最佳的用户体验   因为用户只想从您的应用发布而不是   有兴趣提供额外的读取权限。它也会   提高转化率。

要解决我的问题,我刚刚没有请求任何启动权限(默认情况下你获得“basic_info”读取权限),然后我用

 helper = new UiLifecycleHelper(this, new StatusCallback() {

            @Override
            public void call(Session session, SessionState state, Exception exception) {
                // TODO Auto-generated method stub
                if(state.isOpened()&&!session.getPermissions().contains("publish_actions"))
                    session.requestNewPublishPermissions(new NewPermissionsRequest(SplashScreen.this, "publish_actions"));

            }
        });
在onCreate()中

。由于在会话中发生更改时调用call(),session.isOpen()将为true,如果我们不检查是否设置了权限,我们将进入无限循环。

显然,上面的警告与实际错误无关。正如一个建议,那些有这样问题的人,设置onErrorListener并记录它。

Log.e("FACEBOOK LOGIN ERROR", error.getLocalizedMessage());

答案 3 :(得分:0)

我不确定这是否有用,但它可能与新的SDK版本有关。您使用的是Android Facebook SDK v3.5吗?也许尝试使用早期版本的SDK 3.0.2,您可以找到它浏览他们的github repository

修改

我已经解决了我的问题,但不能说我知道实际问题是什么:

  • 检查您的哈希和app_id,确保在开发者网站上将您的哈希键添加到您的应用程序,而不是示例应用程序。

  • 确保您的清单包含此活动完全按照样本中的指定/显示

    活动android:name =“com.facebook.LoginActivity” 机器人:主题= “@安卓风格/ Theme.Translucent.NoTitleBar”
    android:label =“@ string / app_name”

  • 确保在&lt;中添加元数据。应用程序&gt;你的清单标签

    元数据android:name =“com.facebook.sdk.ApplicationId”android:value =“@ string / app_id”

  • 确保在您的Facebook开发者帐户中,您正在部署的应用程序指定正确的包和主类名称

  • 我还从清单中的主登录活动中删除了以下属性:

    机器人:导出= “真” 机器人:noHistory = “真”

这就是我所做的,它现在似乎有效,我不能说这是否是一个通用修复,但至少值得检查所有这些都是正确的。

答案 4 :(得分:0)

通过WebView登录的事实并不意味着hashkey是正确的,因为即使Facebook应用程序设置中没有hashkey,它也能正常工作。所以请仔细检查你的哈希键。

此外,由于您说它仅适用于您的个人资料而不适用于其他人,请检查您是否正确将其添加为测试人员,或者您是否处于沙盒模式。