Как я могу проверить, выходит ли пользователь из игрового сервиса по умолчанию?
Я интегрировал сервисы игр Google в свою игру, включая списки лидеров и достижения. Если пользователь открывает таблицу лидеров или активность достижения, у него есть возможность выйти из настроек в правом верхнем углу.
Как я могу проверить, действительно ли пользователь вошел в систему? getGamesClient.isConnected() по-прежнему имеет значение true, хотя пользователь вышел из представления Google.
Если я нажимаю кнопку выхода из системы (которая все еще там, поскольку gamesClient все еще подключен), я получаю исключение SecurityException:
08-16 11: 01: 21.262 14288-14288 /? E / AndroidRuntime: ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: основное java.lang.SecurityException на android.os.Parcel.readException(Parcel.java:1425) на android.os.Parcel.readException(Parcel.java:1379) на com.google.android.gms.internal.bm$a$aa(неизвестный источник) на com.google.android.gms.internal.bj.signOut(неизвестный источник) на com.google.android.gms.games.GamesClient.signOut(неизвестный источник)
В данный момент я проверяю код ответа ActivityForResult и отключаю GamesClient, если он находится в несовместимом состоянии, но мне не нравится такой подход.
3 ответа
Попробуйте обработать 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 - это идентификатор, который вы использовали для отображения активности в таблице лидеров или достижениях.
В моем случае я делаю следующее. На 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()
Я думаю, что вам нужно: isSignedIn(); Как это:
public boolean getSignedIn() {
return isSignedIn();
}
Это вернет true или false, если пользователь подписан или нет. Метод в GameHelper.java:
/** Returns whether or not the user is signed in. */
public boolean isSignedIn() {
return mState == STATE_CONNECTED;
}
Надеюсь, поможет.