В связи с прекращением поддержки API Google Sign-In , мы удаляем SDK для игр версии 1 в 2026 году. После февраля 2025 года вы не сможете публиковать в Google Play игры, которые были интегрированы с SDK для игр версии 1. Мы рекомендуем использовать вместо него SDK для игр версии 2.
Хотя существующие игры с интеграцией предыдущих версий v1 будут продолжать работать еще пару лет, мы рекомендуем перейти на версию v2, начиная с июня 2025 года.
Данное руководство предназначено для использования SDK Play Games Services v1. Информацию о последней версии SDK см. в документации v2 .
Для доступа к функционалу сервисов Google Play Games Services вашей игре необходимо предоставить учетную запись авторизованного игрока. Если игрок не авторизован, при обращении к API сервисов Google Play Games Services могут возникать ошибки. В этом документе описано, как реализовать удобную авторизацию в вашей игре.
Реализовать авторизацию игроков.
Класс GoogleSignInClient является основной точкой входа для получения учетной записи текущего авторизованного игрока и для авторизации игрока, если он ранее не авторизовался в вашем приложении на устройстве.
Для создания клиента авторизации выполните следующие действия:
Создайте клиент для авторизации с помощью объекта
GoogleSignInOptions, как показано в следующем фрагменте кода. ВGoogleSignInOptions.Builderдля настройки авторизации необходимо указатьGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN.GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
Если вы хотите использовать
SnapshotsClient, добавьте.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)в вашGoogleSignInOptions.Builder, как показано в следующем фрагменте кода:GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) .build();Вызовите метод
GoogleSignIn.getClient()и передайте параметры, которые вы настроили на предыдущих шагах. Если вызов будет успешным, API входа в систему Google вернет экземплярGoogleSignInClient.
Проверьте, вошел ли игрок уже в систему.
Вы можете проверить, выполнен ли уже вход в учетную запись на текущем устройстве, используя GoogleSignIn.getLastSignedInAccount() , и проверить, предоставлены ли этой учетной записи необходимые разрешения, используя GoogleSignIn.hasPermissions() . Если оба условия верны — то есть, getLastSignedInAccount() возвращает ненулевое значение, а hasPermissions() возвращает true — вы можете безопасно использовать учетную запись, возвращенную методом getLastSignedInAccount() , даже если устройство находится в автономном режиме.
Выполните бесшумную регистрацию.
Вы можете вызвать silentSignIn() , чтобы получить учетную запись текущего авторизованного игрока, и попытаться авторизовать игроков без отображения пользовательского интерфейса, если они успешно вошли в ваше приложение на другом устройстве.
Метод silentSignIn() возвращает Task<GoogleSignInAccount> . После завершения задачи вы устанавливаете в поле GoogleSignInAccount , объявленном ранее, значение учетной записи для входа, которое задача возвращает в качестве результата, или значение null , указывающее на отсутствие авторизованного пользователя.
Если попытка бесшумного входа в систему не удалась, вы можете дополнительно отправить намерение входа в систему для отображения пользовательского интерфейса входа, как описано в разделе «Выполнение интерактивного входа в систему» .
Поскольку состояние авторизованного игрока может меняться, когда активность не находится на переднем плане, мы рекомендуем вызывать silentSignIn() из метода onResume() активности.
Для выполнения входа в систему в автоматическом режиме выполните следующие действия:
- Для запуска процесса бесшумного входа в систему вызовите метод
silentSignIn()объектаGoogleSignInClient. Этот вызов возвращает объектTask<GoogleSignInAccount>, который содержит объектGoogleSignInAccountесли бесшумный вход в систему прошел успешно. - Для обработки успешного или неудачного входа игрока в систему переопределите
OnCompleteListener.- Если вход в систему прошел успешно, получите объект
GoogleSignInAccount, вызвавgetResult(). - Если вход в систему не удался, вы можете отправить намерение входа, чтобы запустить интерактивный процесс авторизации. Список дополнительных обработчиков событий обратного вызова, которые вы можете использовать, см. в руководстве разработчика по API задач и справочнике по API
Task.
- Если вход в систему прошел успешно, получите объект
Следующий фрагмент кода показывает, как ваше приложение может выполнять бесшумный вход в систему:
private void signInSilently() { GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN; GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); if (GoogleSignIn.hasPermissions(account, signInOptions.getScopeArray())) { // Already signed in. // The signed in account is stored in the 'account' variable. GoogleSignInAccount signedInAccount = account; } else { // Haven't been signed-in before. Try the silent sign-in first. GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOptions); signInClient .silentSignIn() .addOnCompleteListener( this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { // The signed in account is stored in the task's result. GoogleSignInAccount signedInAccount = task.getResult(); } else { // Player will need to sign-in explicitly using via UI. // See [sign-in best practices](http://developers.google.com/games/services/checklist) for guidance on how and when to implement Interactive Sign-in, // and [Performing Interactive Sign-in](http://developers.google.com/games/services/android/signin#performing_interactive_sign-in) for details on how to implement // Interactive Sign-in. } } }); } } @Override protected void onResume() { super.onResume(); signInSilently(); }
Если попытка входа в систему в фоновом режиме не удалась, вы можете вызвать метод getException() , чтобы получить исключение ApiException с подробным кодом состояния. Код состояния CommonStatusCodes.SIGN_IN_REQUIRED указывает на то, что игроку необходимо предпринять явные действия для входа в систему. В этом случае ваше приложение должно запустить интерактивный процесс входа в систему, как описано в следующем разделе.
Выполните интерактивную авторизацию.
Для авторизации с помощью взаимодействия с игроком вашему приложению необходимо запустить интент авторизации. В случае успеха API Google Sign-In отобразит пользовательский интерфейс, предлагающий игроку ввести свои учетные данные для входа. Такой подход упрощает разработку вашего приложения, поскольку активность авторизации обрабатывает такие сценарии, как необходимость обновления сервисов Google Play или отображение запросов на согласие, от имени вашего приложения. Результат возвращается через коллбэк onActivityResult .
Для интерактивного входа в систему выполните следующие действия:
Вызовите
getSigninIntent()у объектаGoogleSignInClient, чтобы получить интент для входа, затем вызовитеstartActivity()и передайте этот интент. Следующий фрагмент кода показывает, как ваше приложение может запустить интерактивный процесс входа в систему:private void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }В функции обратного вызова
onActivityResult()обработайте результат, полученный из возвращенного Intent.- Если вход в систему прошел успешно, получите объект
GoogleSignInAccountиз объектаGoogleSignInResult. - Если вход в систему не удался, следует обработать ошибку входа (например, отобразив сообщение об ошибке в всплывающем окне). Следующий фрагмент кода показывает, как ваше приложение может обрабатывать результаты входа игрока:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { // The signed in account is stored in the result. GoogleSignInAccount signedInAccount = result.getSignInAccount(); } else { String message = result.getStatus().getStatusMessage(); if (message == null || message.isEmpty()) { message = getString(R.string.signin_other_error); } new AlertDialog.Builder(this).setMessage(message) .setNeutralButton(android.R.string.ok, null).show(); } } }
- Если вход в систему прошел успешно, получите объект
Получить информацию об игроке
Объект GoogleSignInAccount , возвращаемый API Google Sign-In, не содержит никакой информации об игроке. Если ваша игра использует информацию об игроке, такую как отображаемое имя игрока и идентификатор игрока, вы можете выполнить следующие шаги, чтобы получить эту информацию.
- Чтобы получить объект
PlayersClient, вызовите методgetPlayersClient()и передайте в качестве параметра объектGoogleSignInAccount. - Используйте методы
PlayersClientдля асинхронной загрузки объектаPlayer, содержащего информацию об игроке. Например, вы можете вызватьgetCurrentPlayer()для загрузки текущего авторизованного игрока. Если задача возвращает исключениеApiExceptionсо статусомSIGN_IN_REQUIRED, это означает, что игроку требуется повторная аутентификация. Для этого вызовитеGoogleSignInClient.getSignInIntent()для интерактивной авторизации игрока. - Если задача успешно возвращает объект
Player, вы можете затем вызвать методы объектаPlayerдля получения конкретных сведений об игроке (например,getDisplayName()илиgetPlayerId().
Добавьте кнопку входа в систему.
Чтобы добавить в игру стандартную кнопку входа через Google, можно использовать один из следующих способов:
- Добавьте элемент `
com.google.android.gms.common.SignInButtonв основной макет активности; или - Разработайте пользовательскую кнопку входа в систему в соответствии с рекомендациями Google по фирменному стилю для входа в систему .
Когда пользователи нажимают кнопку входа в систему, ваша игра должна инициировать процесс входа, отправив намерение входа, как описано в разделе «Выполнение интерактивного входа в систему» .
Этот фрагмент кода показывает, как добавить кнопку входа в систему в метод onCreate() для вашей активности.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_in); findViewById(R.id.sign_in_button).setOnClickListener(this); findViewById(R.id.sign_out_button).setOnClickListener(this); }
Приведенный ниже фрагмент кода показывает, как можно отправить Intent для входа в систему, когда пользователь нажимает на кнопку входа.
@Override public void onClick(View view) { if (view.getId() == R.id.sign_in_button) { // start the asynchronous sign in flow startSignInIntent(); } else if (view.getId() == R.id.sign_out_button) { // sign out. signOut(); // show sign-in button, hide the sign-out button findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); findViewById(R.id.sign_out_button).setVisibility(View.GONE); } }
Отображать всплывающие окна игры
В игре можно отображать всплывающие окна с помощью класса GamesClient . Например, игра может показывать всплывающее окно «Добро пожаловать обратно» или «Достижения разблокированы». Чтобы разрешить Google Play Games Services запускать всплывающие окна в представлениях вашей игры, вызовите метод setViewForPopups() . Вы можете дополнительно настроить местоположение всплывающего окна на экране, вызвав метод setGravityForPopups() .
Выйти из системы
Выход из системы осуществляется путем вызова метода signOut() объекта GoogleSignInClient .
private void signOut() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.signOut().addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // at this point, the user is signed out. } }); }