Android 在设备上安装Facebook应用程序时,SSO(单点登录)不工作

Android 在设备上安装Facebook应用程序时,SSO(单点登录)不工作,android,facebook,Android,Facebook,我正在开发一款与facebook集成的Android应用程序。当我设置LoginButton.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO)时,应用程序运行得非常好 当我尝试使用SSO时,问题出现了。我得到下面的错误。当我使用不正确的keyhash时,我常常会遇到类似的错误;现在不再是这种情况,因为Webview登录工作正常。更令人惊讶的是,如果Android应用程序安装在FB中,它就能正常工作。例如,我是应用程序管理者,因此默认情况下,它

我正在开发一款与facebook集成的Android应用程序。当我设置LoginButton.setLoginBehavior(SessionLoginBehavior.SUPPRESS_SSO)时,应用程序运行得非常好

当我尝试使用SSO时,问题出现了。我得到下面的错误。当我使用不正确的keyhash时,我常常会遇到类似的错误;现在不再是这种情况,因为Webview登录工作正常。更令人惊讶的是,如果Android应用程序安装在FB中,它就能正常工作。例如,我是应用程序管理者,因此默认情况下,它会安装在我的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)
08-24 01:39:16.058:W/Bundle(21880):Key com.facebook.platform.protocol.protocol\u版本应为字符串,但值为java.lang.Integer。返回了默认值。
08-24 01:39:16.068:W/捆绑包(21880):尝试强制转换生成的内部异常:
08-24 01:39:16.068:W/Bundle(21880):java.lang.ClassCastException:java.lang.Integer无法转换为java.lang.String
08-24 01:39:16.068:W/Bundle(21880):位于android.os.Bundle.getString(Bundle.java:1069)
08-24 01:39:16.068:W/Bundle(21880):位于android.content.Intent.getStringExtra(Intent.java:4350)
08-24 01:39:16.068:W/Bundle(21880):在com.facebook.AuthorizationClient$KatanaLoginDialogAuthHandler.tryAuthorize(AuthorizationClient.java:821)
08-24 01:39:16.068:W/Bundle(21880):在com.facebook.AuthorizationClient.tryCurrentHandler(AuthorizationClient.java:272)
08-24 01:39:16.068:W/Bundle(21880):位于com.facebook.AuthorizationClient.tryNextHandler(AuthorizationClient.java:238)
08-24 01:39:16.068:W/Bundle(21880):在com.facebook.AuthorizationClient$gettokenauthnhandler.getTokenCompleted(AuthorizationClient.java:772)
08-24 01:39:16.068:W/Bundle(21880):在com.facebook.AuthorizationClient$GetTokenAuthHandler$1.完成(AuthorizationClient.java:731)
08-24 01:39:16.068:W/Bundle(21880):位于com.facebook.internal.PlatformServiceClient.callback(PlatformServiceClient.java:144)
08-24 01:39:16.068:W/Bundle(21880):位于com.facebook.internal.PlatformServiceClient.handleMessage(PlatformServiceClient.java:128)
08-24 01:39:16.068:W/Bundle(21880):在com.facebook.internal.PlatformServiceClient$1.handleMessage(PlatformServiceClient.java:54)
08-24 01:39:16.068:W/Bundle(21880):在android.os.Handler.dispatchMessage(Handler.java:99)上
08-24 01:39:16.068:W/Bundle(21880):在android.os.Looper.loop(Looper.java:137)
08-24 01:39:16.068:W/Bundle(21880):位于android.app.ActivityThread.main(ActivityThread.java:5227)
08-24 01:39:16.068:W/Bundle(21880):位于java.lang.reflect.Method.invokenactive(本机方法)
08-24 01:39:16.068:W/Bundle(21880):位于java.lang.reflect.Method.invoke(Method.java:511)
08-24 01:39:16.068:W/Bundle(21880):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:795)
08-24 01:39:16.068:W/Bundle(21880):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:562)
08-24 01:39:16.068:W/束(21880):在dalvik.system.NativeStart.main(本机方法)

问题是hashkey是wong

适用于Linux

开放式终端:

用于调试生成

keytool -exportcert -alias androiddebugkey -keystore debug.keystore | openssl sha1 -binary | openssl base64
keytool -exportcert -alias <aliasName> -keystore <keystoreFilePath> | openssl sha1 -binary | openssl base64
您将在“.android”文件夹中找到debug.keystore,将其复制并粘贴到桌面上,然后运行上述命令

发布版本

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

注意:确保在这两种情况下都必须询问密码。如果它没有要求输入密码,这意味着命令中有错误。

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

编辑:

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

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

  • 确保清单中包含的此活动与示例中指定/显示的内容完全一致

    活动android:name=“com.facebook.LoginActivity” android:theme=“@android:style/theme.transparent.NoTitleBar”
    android:label=“@string/app\u name”

  • 确保在清单的标记中添加元数据

    元数据android:name=“com.facebook.sdk.ApplicationId”android:value=“@string/app\u id”

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

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

    android:exported=“true” android:noHistory=“true”


这就是我所做的,目前看来还有效,我不能说这是否是一个通用的解决方案,但至少值得检查所有这些都是正确的。

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

此外,既然你说它只适用于你的个人资料,而不适用于其他人,请检查你是否正确地将他们添加为测试人员,或者你不是
Log.e("FACEBOOK LOGIN ERROR", error.getLocalizedMessage());
intent.getStringExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION));
""+intent.getIntExtra(NativeProtocol.EXTRA_PROTOCOL_VERSION, 0));