Как я могу проверить, выходит ли пользователь из игрового сервиса по умолчанию?

Я интегрировал сервисы игр 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;
}

Надеюсь, поможет.

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