Сбой приложения при отправке рейтинга в Google Play

У меня есть некоторые проблемы с моим приложением для Android.

Я использую сервисы игровых игр Google с таблицами лидеров. Я импортирую все библиотеки, я делаю все, что нужно...

В своей основной деятельности я следую документации Google developper здесь и использую:

mClient.connect();

для связи, и это работает.

В конце игры я пытаюсь представить счет. Я видел на форумах, что я могу поместить mClient в статическое состояние, чтобы использовать его в другой деятельности. Поэтому я звоню в onCreate:

Games.Leaderboards.submitScore(MainActivity.mClient, getString(R.string.class_1), myscore);

Но приложение вылетает при отправке счета. У меня есть эти ошибки:

12-14 15:37:24.856: E/AndroidRuntime(19613): FATAL EXCEPTION: main
12-14 15:37:24.856: E/AndroidRuntime(19613): java.lang.RuntimeException: Unable to resume activity {com.test.app/com.test.app.Result}: java.lang.IllegalStateException: GoogleApiClient must be connected.
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2141)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:2156)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1680)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.ActivityThread.access$1500(ActivityThread.java:121)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:943)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.os.Looper.loop(Looper.java:130)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.ActivityThread.main(ActivityThread.java:3701)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at java.lang.reflect.Method.invokeNative(Native Method)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at java.lang.reflect.Method.invoke(Method.java:507)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:624)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at dalvik.system.NativeStart.main(Native Method)
12-14 15:37:24.856: E/AndroidRuntime(19613): Caused by: java.lang.IllegalStateException: GoogleApiClient must be connected.
12-14 15:37:24.856: E/AndroidRuntime(19613):    at com.google.android.gms.common.internal.o.a(Unknown Source)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at com.google.android.gms.games.Games.c(Unknown Source)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at com.google.android.gms.games.internal.api.LeaderboardsImpl.submitScore(Unknown Source)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at com.google.android.gms.games.internal.api.LeaderboardsImpl.submitScore(Unknown Source)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at com.test.app.Result.onResume(Result.java:129)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1150)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.Activity.performResume(Activity.java:3832)
12-14 15:37:24.856: E/AndroidRuntime(19613):    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2131)
12-14 15:37:24.856: E/AndroidRuntime(19613):    ... 12 more

В начале пишется "GoogleApiClient должен быть подключен", но "mClient" подключен. Поэтому я также пытаюсь отправить счет в MainActivity без mClient в статическом режиме, но также происходит сбой приложения.

1 ответ

Лучшая практика для управления клиентом Google API - для каждого действия поддерживать свое собственное состояние клиента. Посмотрите этот вопрос для более детального обсуждения: Доступ к клиенту Google Plus из нескольких действий.

Пользовательский опыт будет входить в "основное действие", а затем в действии в конце игры, проверять client.isConnected() (и вызывать connect, если не подключен), а затем после подключения отправлять счет. Таким образом, перед вызовом API вы убедитесь, что у вас есть действующий клиент.

Другие вопросы по тегам