谷歌游戏服务:奇怪的登录行为

8
最近我在我的应用程序中添加了Google Play Game服务支持(添加了BaseGameActivity和GameHelper),并且它的登录和注销流程工作正常。在我的图形线程中,我向主活动处理程序发送消息,它调用beginUserInitiatedSignIn或signOut。当识别过程完成时,Game Helper会调用我的活动的onSignInFailed或onSignInSucceeded,并且我可以检查isSignedIn(如果onSignInSucceeded被调用,则为true)。
但是今天我发现它表现很奇怪。可悲的是我没有备份最后一个工作版本,但实质代码是相同的。
如果我要求应用程序登录,它会显示Google服务登录对话框(我的设备上有2个帐户)。我选择一个帐户,按下确定,它返回到我的应用程序,但既不调用onSignInSucceeded也不调用onSignInFailed(之前如果我取消此对话框,我会看到“未知错误”消息)。当我尝试第二次登录时,它启动旋转的圆圈并无限等待。如果我点击屏幕,它会终止等待并返回到我的视图。
尽管如此,如果我关闭应用并再次启动它,它将成功登录,调用onSignSucceded并在运行时保持连接。它说:
onCreate: creating GamesClient
onStart.
onStart: connecting clients.
Connecting GamesClient.
onConnected: connected! client=1
All clients now connected. Sign-in successful.
All requested clients connected. Sign-in succeeded!

如果我退出登录,然后再尝试登录,它会显示账户对话框,并写着:
isGooglePlayServicesAvailable returned 0
beginUserInitiatedSignIn: starting new sign-in flow.
Connecting GamesClient.
onConnectionFailed: result 4
onConnectionFailed: since user initiated sign-in, trying to resolve problem.
resolveConnectionResult: trying to resolve result: ConnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent{41f8a610: android.os.BinderProxy@41f8a5b0}}
result has resolution. Starting it.

当我选择一个帐户时,它返回到我的活动页面,但既没有调用onSignInSucceeded也没有调用onSignInFailed。如果我在运行时进行检查,我会发现应用程序未连接到Google服务。 当我尝试重新登录时,它会显示无限旋转的圆圈,并显示以下内容:

isGooglePlayServicesAvailable returned 0
beginUserInitiatedSignIn: continuing pending sign-in flow.
resolveConnectionResult: trying to resolve result: ConnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent{41f8a610: android.os.BinderProxy@41f8a5b0}}
result has resolution. Starting it. 

当我点击屏幕时,圆圈会中止,而不会调用onSignInSucceeded或onSignInFailed等函数。
我无法想象出了什么问题。处理程序是在主线程上创建的。我有谷歌的示例,它可以登录和注销,没有任何问题,就像我的应用程序一样。有人能告诉我可能出了什么问题吗?谢谢!

也许你需要分享一些代码! - thiagolr
其实我不知道要分享什么代码...一切都和往常一样。我的活动是从Google的BaseGameActivity继承而来的。我在主线程中调用这两个方法(beginUserInitiatedSignIn或signOut),并期望回调onSignInSucceeded或onSignInFailed。我想如果有人遇到类似的症状,他们可以建议出错了什么。也许是服务器设置出了问题。但以前它是可以工作的... - Tertium
1个回答

25

找出一个愚蠢的错误花了2天时间。当你扩展BaseGameActivity时,请确保在你的活动方法中调用它的所有方法(如果你重写了它们),例如:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
{
 super.onActivityResult(requestCode, resultCode, data);
 ....
 <our code here>
}

BaseGameActivity调用其聚合的mHelper对象的方法,该对象执行所有的操作。


1
哇,这正是我需要的确切解决方案。我添加了onActivityResult,但在添加所需的代码(包括super.onActivityResult)之前进行了测试。感谢您发布您的解决方案! - easycheese
你真是救命恩人!我会在23小时内给你+100的声望值! - Stephane Mathis
自从我开始使用Mercurial后,我的生活变得不同了。如果我每天提交代码,我就可以看到发生了什么变化。但是在使用SVN时,我必须小心谨慎,并且需要离线工作(我曾经历过几次SVN分支合并的噩梦)。 - Tertium
你太棒了!谢谢你! - async
好发现!我遇到了完全相同的问题,我忘记从 onActivityResult() 中调用 super() 了。谢谢你发布解决方案,它节省了我很多时间。 - Daniel

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