最近,我准备将Android排行榜和成就版的Google Play服务应用于Android应用。由于某些未知原因,登录会随机停止工作 - 直到应用程序的apk被重新安装。
1)一般假设
在草稿模式下正确设置了开发者控制台,并注册了测试人员帐户。
全新安装apk后,登录游戏的工作正常。提交分数和解锁成就有效。排行榜和成就活动得到了恰当的展示。
简短:一切都按预期工作 - 一段时间。
2)问题描述
经过几次断开连接(包括Games.signOut()+ GoogleApiClient实例disconnect())并重新连接(GoogleApiClient实例connect()),在某些时候,似乎已经关闭应用程序中的随机,app已经已重新启动,分数和成就已提交并解锁,onActivityResult()的resultCode为10002 / GamesActivityResultCodes.RESULT_SIGN_IN_FAILED。我试图重建错误何时出现,但基本上只是那个行为加上一个随机元素。
之后,GoogleApiClient实例上没有connect(),reconnect()或disconnect(),包括Games.signOut()。
重新启动应用,终止任务,清除缓存和数据,尝试在一天后登录 - 无处可用。只是重新安装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。
它的构造函数使用带有Games.API和Games.SCOPE_GAMES的GoogleApiClient.Builder。
帮助程序还实现了ConnectionCallbacks和OnConnectionFailedListener,而Builder将它用于两个侦听器。
onConnectionFailed方法处理状态变量“isErrorBeingHandled”,如文档中建议的那样,暂时保存在onSaveInstanceState()中。
如果hasResolution()上的ConnectionResult为true,则会调用其startResolutionForResult(),否则将调用GooglePlayServicesUtil.getErrorDialog()。
帮助器的onActivityResult(),如果requestCode是分辨率或错误对话框,则在Activity.RESULT_OK上将调用GoogleApiClient实例上的connect(),另一个结果将无效(也尝试在GoogleApiClient上连接和断开连接)实例,包括Games.signOut())。
4)谢谢!
更新
我尝试为应用发布Google Play服务(排行榜,成就等)。像神奇地一样,错误10002消失,并且再次使用一次被阻止的帐户就可以登录。目前我将测试它是否继续工作。
只有在给出以下几点时才会出现我当前理解中的错误:
我的理论是,Google Play服务框架中的某些缓存无法正常运行,只有在重新安装apk或在Google Play服务发布后才能恢复正常状态时,它才会重置。
答案 0 :(得分:1)
在我的情况下,AndroidManifest中的versionCode与Google Play开发者控制台中我的APK的版本号不同。将我的新APK上传到Google Play开发者控制台后,10002问题似乎消失了。
答案 1 :(得分:1)
这个错误通常是配置错误,就像Henry提到的时间戳问题一样。发生这种情况的另一种情况是,当您的AndroidManifest.xml没有正确的应用程序ID时(它需要是开发控制台中google play列表中的10位以上数字(不是apk列表)。
Android系列看起来像
<meta-data android:name="com.google.android.gms.games.APP_ID" android:value="12345678912" />
FWIW,我通常做模板样式,有值=“@ string / app_id”并在资源中定义该字符串,但原始值也应该有用。
答案 2 :(得分:1)
tl; dr
您使用错误的帐户登录该应用。
长篇故事
在我的情况下,我手机上有3个不同的帐户,我试图从错误的帐户(隐式)登录。怎么可能是一个错误的帐户?因此,基本上应用程序在“测试模式”开始时,只有开发人员控制台中列出的特定帐户才能访问api。所以,我做的是访问了Google Play游戏应用,并更改了可以登录的帐户的设置。
答案 3 :(得分:0)
我意识到现在已经很老了,但我发现了一个有用的帖子here,因为Google Developer Console项目是使用旧版本的Google API控制台创建的,因此该问题可能存在。 / p>
答案 4 :(得分:0)
我发现,当我尝试通过dev apk上传到google dev控制台时,它给我一个错误,我的SHA不匹配。它显示了两个SHA。将用于开发版本的SHA添加到Android应用程序下的firebase项目设置中。
一旦您这样做,就完全不需要将apk上传到开发控制台,我只是按照另一个答案中的建议进行操作。