最近,我正要將Google Play服務的排行榜和成就應用於Android應用。由於某些未知原因,signin會隨機停止工作 - 直到應用的apk重新安裝。Google Play遊戲/服務登錄隨機停止使用resultCode GamesActivityResultCodes.RESULT_SIGN_IN_FAILED/10002
1)一般假設
開發者控制檯中正確設置了,在草稿模式下,註冊一個賬號測試儀。
全新安裝apk後,登錄遊戲會按預期工作。提交分數並解鎖成就作品。排行榜和成就活動得到正確顯示。
短:一切都按預期工作 - 一段時間。
2)問題說明
幾個斷開(其由Games.signOut(的)+ GoogleApiClient實例斷開())和重新連接後(GoogleApiClient實例連接()),在某些時候,這似乎在隨機onActivityResult()具有10002/GamesActivityResultCodes.RESULT_SIGN_IN_FAILED的resultCode。已經關閉應用程序,應用程序已重新啓動,分數和成就已提交併解鎖。我試圖在出現錯誤時重新構建,但基本上只是該行爲加上一個隨機元素。
之後,包括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
總之:一些在SignInActivity似乎失敗圍繞過渡4或5時GameAgent隨機聲稱「應用程序ID [REMOVED APP ID]與軟件包[已刪除的軟件包名稱]無關。「
可悲的是,我無法找到它們的來源進行深入調查,所以我要問,如果任何人有一個想法如何解決這個問題。在目前的狀態下,如果用戶永遠被鎖定,這顯然不起作用。
我正在使用最新的Google Play服務庫。
3)代碼結構
通過文檔中讀取後,有使用BaseGameUtils,作爲中間體的溶液或純GoogleApiClient的GameHelper的方式。當然,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)謝謝!
更新
我嘗試發佈谷歌Play服務的應用程序(排行榜,成就等)。就像奇蹟般地,錯誤10002消失並且可以再次登錄一次被阻止的帳戶。目前我會測試是否繼續工作。
僅給出以下幾點發生從我目前的理解錯誤:
- 未公佈或公佈一次,目前未公佈的谷歌遊戲服務
- 測試賬戶中註冊
- 新鮮的APK安裝
- 隨機擺弄連線,斷開/登出,提交得分,解鎖成就,顯示排行榜,顯示成績
- 工作一段時間
- 如果APK被新安裝或谷歌Play服務的一些隨機時間後堵,而不永遠resultCode爲10002
- 疏通只能再次登錄的機會得到發表
我的理論是,一些緩存的Google Play服務框架無法正常運行,只有重新安裝apk或在Google Play服務發佈時處於正確狀態,Google Play服務纔會重置。
爲什麼你問一個問題而不是消失?閱讀這些答案,並且如果它能夠幫助其他程序員(如我)儘快找到真正的答案,請評論您的觀點並將其標記爲解決方案。這不是stackoverflow.com的作品。 – Recomer 2016-06-28 19:04:06