Google Play 游戏/服务登录随机停止使用 resultCode GamesActivityResultCodes.RESULT_SIGN_IN_FAILED / 10002
Posted
技术标签:
【中文标题】Google Play 游戏/服务登录随机停止使用 resultCode GamesActivityResultCodes.RESULT_SIGN_IN_FAILED / 10002【英文标题】:Google Play Games / Services signin randomly stops working with resultCode GamesActivityResultCodes.RESULT_SIGN_IN_FAILED / 10002 【发布时间】:2014-12-14 07:27:02 【问题描述】:最近,我打算在一个 android 应用中实现带有排行榜和成就的 Google Play 服务。由于某些未知原因,登录会随机停止工作 - 直到重新安装应用的 apk。
1) 一般假设
开发者控制台已正确设置,处于草稿模式,并注册了测试人员帐户。
全新安装 apk 后,登录 Games 会按预期工作。提交分数和解锁成就作品。排行榜和成就活动正确显示。
简短:一切都按预期工作 - 一段时间。
2) 问题描述
在几次断开连接(包括 Games.signOut() + GoogleApiClient 实例 disconnect())并重新连接(GoogleApiClient 实例 connect())后,在某个时间点,这似乎是应用程序已关闭的随机方式,应用程序已已重新启动,分数和成就已提交并解锁,onActivityResult() 的 resultCode 为 10002 / GamesActivityResultCodes.RESULT_SIGN_IN_FAILED。我试图重建错误出现的时间,但基本上只是那个行为加上一个随机元素。
此后,包括 Games.signOut() 在内的 GoogleApiClient 实例上的 connect()、reconnect() 或 disconnect() 不再起作用。
重新启动应用程序,终止任务,清除缓存和数据,一天后尝试登录 - 没有任何效果。只是重新安装 apk 似乎会重置它 - 持续时间很短,直到错误再次发生。
我试图调查 logcat。可疑的部分似乎在这里:
D/SurfaceFlinger( 155): createSurface for (1 x 1), name=com.google.android.gms/com.google.android.gms.common.account.AccountPickerActivity
I/ActivityManager( 394): Displayed com.google.android.gms/.common.account.AccountPickerActivity: +130ms
D/SignInActivity(15720): Transition from 2 to 3
D/SignInActivity(15720): Transition from 3 to 4
D/SignInActivity(15720): Transition from 4 to 5
E/GameAgent(10397): Unable to retrieve application [REMOVED APP ID] from network
E/GameAgent(10397): Application ID [REMOVED APP ID] is not associated with package [REMOVED PACKAGE NAME]. Check the application ID in your manifest.
E/CheckGameplayAcl(15720): Unable to load metadata for game
D/SignInActivity(15720): Transition from 5 to 9
W/SignInActivity(15720): onSignInFailed()...
W/SignInActivity(15720): ==> Returning non-OK result: 10002
I/System.out(16173): onActivityResult: requestCode = 1003, resultCode = 10002 gac: false/false
System.out 是助手的 onActivityResult() 的调试消息。 gac 是 GoogleApiClient 实例,false/false 代表 isConnected() 和 isConnecting()。
为了避免对错误的开发者控制台设置的不当假设:全新安装后,它适用于一些注册(大约五个,但不是固定数量)!
为此,我展示了之前工作尝试的 logcat 部分:
D/SurfaceFlinger( 155): createSurface for (1 x 1), name=com.google.android.gms/com.google.android.gms.common.account.AccountPickerActivity
I/ActivityManager( 394): Displayed com.google.android.gms/.common.account.AccountPickerActivity: +153ms
D/SignInActivity(15720): Transition from 2 to 3
D/SignInActivity(15720): Transition from 3 to 4
D/SignInActivity(15720): Transition from 4 to 5
E/GameAgent(10397): Unable to retrieve application [REMOVED APP ID] from network
D/SignInActivity(15720): Transition from 5 to 6
D/SignInActivity(15720): Transition from 6 to 7
D/SignInActivity(15720): Transition from 7 to 8
I/System.out(16173): onActivityResult: requestCode = 1003, resultCode = -1 gac: false/false
总结:当 GameAgent 随机声明“应用程序 ID [已删除的应用程序 ID] 与包 [已删除的软件包名称] 没有关联”时,SignInActivity 中的某些内容似乎在转换 4 或 5 附近失败。
遗憾的是,我找不到他们的来源进行更多调查,所以我不得不询问是否有其他人知道如何解决它。在当前状态下,如果用户被永久锁定显然是行不通的。
我正在使用最新的 Google Play 服务库。
3) 代码结构
通读文档后,有使用 BaseGameUtils、GameHelper 作为中间解决方案或纯 GoogleApiClient 的方法。当然,GoogleApiClient 将是正确的选择。
我创建了一个帮助类,按照文档推荐的程序结构。
它在 Activity 的 onCreate 中被实例化。转发给它的是 onStart、onStop、onSaveInstanceState 和 onActivityResult。
其构造函数将 GoogleApiClient.Builder 与 Games.API 和 Games.SCOPE_GAMES 结合使用。
帮助器还实现了 ConnectionCallbacks 和 OnConnectionFailedListener,而 Builder 将它用于两个侦听器。
onConnectionFailed 方法按照文档中的建议处理“isErrorBeingHandled”的状态变量,暂时保存在 onSaveInstanceState() 中。
如果在 hasResolution() 上 ConnectionResult 为真,则将调用其 startResolutionForResult(),否则将调用 GooglePlayServicesUtil.getErrorDialog()。
助手的 onActivityResult(),如果 requestCode 是解决方案或错误对话框中的一个,则在 Activity.RESULT_OK 上将调用 GoogleApiClient 实例上的 connect(),在另一个结果上将不执行任何操作(也尝试在 GoogleApiClient 上连接和断开连接实例,包括 Games.signOut())。
4) 谢谢!
更新
我尝试为该应用发布 Google Play 服务(排行榜、成就等)。就像神奇地一样,错误 10002 消失了,并且可以再次使用曾经被阻止的帐户登录。目前我会测试它是否继续工作。
根据我目前的理解,只有在给出以下几点时才会发生错误:
-
未发布或曾经发布但现在未发布的 Google Play 服务
已注册测试帐号
全新安装apk
随机摆弄连接、断开/注销、提交分数、解锁成就、显示排行榜、显示成就
工作了一段时间
在随机时间后阻塞,没有机会再次使用 resultCode 10002 登录
只有在新安装 apk 或发布 Google Play 服务时才能解除阻止
我的理论是 Google Play 服务框架中的某些缓存无法正常工作,并且只有在重新安装 apk 或在 Google Play 服务发布时它处于正确状态时才会重置。
【问题讨论】:
你为什么要问一个问题而不是消失?阅读这些答案,然后评论您的意见并标记为解决方案,如果它有助于其他程序员(如我)尽快找到真正的答案。这不是 ***.com 的作品。 【参考方案1】:就我而言,我的 AndroidManifest 中的 versionCode 与我在 Google Play Developer Console 中的 APK 的版本号不同。将我的新 APK 上传到 Google Play Developer Console 后,10002 问题似乎消失了。
【讨论】:
【参考方案2】:此错误通常是配置错误,例如 Henry 提到的时间戳问题。发生这种情况的另一种情况是您的 AndroidManifest.xml 没有正确的应用程序 ID(它需要是开发控制台中的 google play 列表(而不是 apk 列表)中的 10+ 位数字。
Android 线看起来像
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="12345678912" />
FWIW,我通常使用模板样式,具有 value="@string/app_id" 并在资源中定义该字符串,但原始值也应该可以工作。
【讨论】:
【参考方案3】:tl;dr
您使用错误的帐户登录应用程序。
长篇大论
在我的情况下,我的手机上有 3 个不同的帐户,我试图(隐式)从错误的帐户登录。您可能会问怎么可能是一个错误的帐户?因此,基本上该应用程序一开始处于“测试模式”,只有开发人员控制台中列出的特定帐户才能访问 api。所以,我所做的就是转到 Google Play Games 应用,并更改了选择可以登录的帐户的设置。
【讨论】:
顺便说一句,您可以向开发控制台添加更多帐户。【参考方案4】:我意识到这已经很老了,但我发现了一个有用的帖子 here,它认为这个问题可能是因为 Google Developer Console 项目是使用旧版本的 Google API 控制台创建的。
【讨论】:
【参考方案5】:我发现当我尝试通过 dev apk 上传到谷歌开发控制台时,它给了我一个错误,即我的 SHA 不匹配。它向您显示了两个 SHA。将用于开发构建的 SHA 添加到 Android 应用下的 Firebase 项目设置中。
这样做后,您根本不需要将 apk 上传到开发控制台,我只是按照另一个答案中的建议这样做。
【讨论】:
以上是关于Google Play 游戏/服务登录随机停止使用 resultCode GamesActivityResultCodes.RESULT_SIGN_IN_FAILED / 10002的主要内容,如果未能解决你的问题,请参考以下文章