2

Я включил сервисы google-игр в свою игру, включая Leaderboards и достижения. Если пользователь открывает таблицу лидеров или достижение, у него есть возможность выйти из настроек в правом верхнем углу.Как я могу проверить, не вызывается ли пользователь из режима просмотра игр по умолчанию?

Как я могу проверить, действительно ли пользователь зарегистрировался? getGamesClient.isConnected() по-прежнему верен, хотя пользователь вышел из представления google.

Если я нажав на кнопку выхода из системы (которая все еще там, becaus gamesClient все еще подключен) я получаю SecurityException:

08-16 11: 01: 21.262 14288-14288 /? E/AndroidRuntime: FATAL EXCEPTION: main java.lang.SecurityException at android.os.Parcel.readException (Parcel.java:1425) at android.os.Parcel.readException (Parcel.java:1379) at com. google.android.gms.internal.bm $ a $ aa (Неизвестный источник) at com.google.android.gms.internal.bj.signOut (Неизвестный источник) в com.google.android.gms.games.GamesClient. signOut (Неизвестный источник)

В настоящий момент я проверяю код ответа ActivityForResult и отключает GamesClient, если он находится в противоречивом состоянии, но мне не нравится этот подход.

ответ

19

Попробуйте обработку onActivityResult:

public boolean onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    if (requestCode == RC_YOUR_UNIQUE_ID 
      && resultCode == GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED) { 
     mHelper.disconnect(); 
     // update your logic here (show login btn, hide logout btn).    
    } else { 
     mHelper.onActivityResult(requestCode, resultCode, data); 
    } 
    return false; 
} 

RC_YOUR_UNIQUE_ID это идентификатор вы использовали для показа Leaderboard или достижения активности.

+1

Это должен быть принятый ответ. – nhaarman

+0

Спасибо, спасли меня много времени. – QuantumKarl

+0

Это должно быть обновлено до 'mHelper.disconnect()'. Спасибо за этот ответ, мне очень помогли! –

0

Я думаю, что вам нужно: isSignedIn(); Как это:

public boolean getSignedIn() { 
    return isSignedIn(); 
} 

Это будет возвращать истинным или ложным, если пользователь подписан или нет. Метод в GameHelper.java:

/** Returns whether or not the user is signed in. */ 
public boolean isSignedIn() { 
    return mState == STATE_CONNECTED; 
} 

Надеется, что это помогает.

+0

Проблема заключается в том, что я (или скорее GameHelper) установить mState, например, в onStop() или в signOut(). Но если пользователь выберет из настроек активности Leaderboard, предоставленных google, ничего подобного signOut() не произойдет, следовательно, переменная mState не изменится и даже дает неправильное состояние, поскольку оно указывает, что я подписан но не я. – trapzerapzerix

0

В моем случае я делаю следующее. По MainActivity ovveride onActivityResult(). RC_UNUSED является requestCode, когда вы позвоните, чтобы открыть Leaderboards, Achievements и Settings активность из приложения Google Play.

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent intent) { 
    super.onActivityResult(requestCode, resultCode, intent); 
if (requestCode == RC_UNUSED 
&& resultCode == GamesActivityResultCodes.RESULT_RECONNECT_REQUIRED) { 
     signOut(); 
    } 

    Log.i("test", "On Activity result called"); 
} 

Написать свой метод signOut() следующим

public void signOut() { 
    try { 
     Games.signOut(mGoogleApiClient); 
    }catch (SecurityException se){ 
     Log.i("test", "mGoogleApiClient status was disconnected when callin signOut status. message = " + se.getMessage()); 
    } 
    if (mGoogleApiClient.isConnected()) { 
     mGoogleApiClient.disconnect(); 
    } 
    // update your UI logic here (show login btn, hide logout btn). 
} 

Не забудьте обновить пользовательский интерфейс на конце signOut()

 Смежные вопросы

  • Нет связанных вопросов^_^