Как загрузить данные игровых сервисов Google Play, сохраненных в режиме «Снимок игр», без вывода сообщений? - PullRequest
0 голосов
/ 03 октября 2018

Я пытаюсь использовать функцию сохраненных игр Google с Google Play Games Services в моем приложении для Android.Google предоставляет пример кода, как это сделать :

private static final int RC_SAVED_GAMES = 9009;
private String mCurrentSaveName = "snapshotTemp";

private void showSavedGamesUI() {
  SnapshotsClient snapshotsClient =
      Games.getSnapshotsClient(this, GoogleSignIn.getLastSignedInAccount(this));
  int maxNumberOfSavedGamesToShow = 5;

  Task<Intent> intentTask = snapshotsClient.getSelectSnapshotIntent(
      "See My Saves", true, true, maxNumberOfSavedGamesToShow);

  intentTask.addOnSuccessListener(new OnSuccessListener<Intent>() {
    @Override
    public void onSuccess(Intent intent) {
      startActivityForResult(intent, RC_SAVED_GAMES);
    }
  });
}

@Override
protected void onActivityResult(int requestCode, int resultCode,
                                Intent intent) {
  if (intent != null) {
    if (intent.hasExtra(SnapshotsClient.EXTRA_SNAPSHOT_METADATA)) {
      // Load a snapshot.
      SnapshotMetadata snapshotMetadata =
          intent.getParcelableExtra(SnapshotsClient.EXTRA_SNAPSHOT_METADATA);
      mCurrentSaveName = snapshotMetadata.getUniqueName();

      // Load the game data from the Snapshot
      // ...
    } else if (intent.hasExtra(SnapshotsClient.EXTRA_SNAPSHOT_NEW)) {
      // Create a new snapshot named with a unique string
      String unique = new BigInteger(281, new Random()).toString(13);
      mCurrentSaveName = "snapshotTemp-" + unique;

      // Create the new snapshot
      // ...
    }
  }
}

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

Я, с другой стороны, хочу сделать это решение для пользователя.Однако я не могу найти способ вернуть список снимков и загрузить данные снимков.

Поскольку моей игре не требуется поддерживать более одной сохраненной игры на пользователя, я менее заинтересован вполучение списка снимков без намерения (хотя это было бы интересным решением) и многое другое при загрузке снимка на основе имени сохраненной игры в автоматическом режиме.

Как загрузить снимок, не показываянамерение

1 Ответ

0 голосов
/ 11 октября 2018

Комментарий Джесс привел меня к решению, которое сейчас устарело.Однако тот, кто опубликовал ответ, отметил, что в образце приложения CollectAllTheStars, которое предоставляется компанией Google, есть и рабочее решение.Я испытал желание проверить этот пример приложения, чтобы узнать, изменила ли команда Google код, чтобы он соответствовал новому подходу.К моему удовольствию, комментарии в этом примере приложения все еще описывали старый устаревший способ, но к счастью код был изменен.

Проверка кода дала мне идеи, поэтому я пришел к такому решению:

String serializedSavedGameData;
public void downloadSavedGameData(final String name) {
    if(snapshotsClient != null) {
        snapshotsClient.open(name, true, SnapshotsClient.RESOLUTION_POLICY_MOST_RECENTLY_MODIFIED).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e(TAG, "Error while opening snapshot: ", e);
            }
        }).continueWith(new Continuation<SnapshotsClient.DataOrConflict<Snapshot>, byte[]>() {
            @Override
            public byte[] then(@NonNull Task<SnapshotsClient.DataOrConflict<Snapshot>> task) throws Exception {
                Snapshot snapshot = task.getResult().getData();
                // Opening the snapshot was a success and any conflicts have been resolved.
                try {
                    // Extract the raw data from the snapshot.
                    return snapshot.getSnapshotContents().readFully();
                } catch (IOException e) {
                    Log.e(TAG, "Error while reading snapshot: ", e);
                } catch (NullPointerException e) {
                    Log.e(TAG, "Error while reading snapshot: ", e);
                }
                return null;
            }
        }).addOnCompleteListener(new OnCompleteListener<byte[]>() {
            @Override
            public void onComplete(@NonNull Task<byte[]> task) {
                if(task.isSuccessful()) {
                    byte[] data = task.getResult();
                    try {
                        serializedSavedGameData = new String(data, "UTF-16BE");
                    } catch (UnsupportedEncodingException e) {
                        Log.d(TAG, "Failed to deserialize save game data: " + e.getMessage());
                    }
                } else {
                    Exception ex = task.getException();
                    Log.d(TAG, "Failed to load saved game data: " + (ex != null ? ex.getMessage() : "UNKNOWN"));
                }
            }
        });
    }
}

Я реализовал простую политику разрешения (возьмите новейшую сохраненную игру на конфликтах), но у меня не было времени тщательно тестировать все различные случаи, такие как конфликты, но он прошел мои простые тесты до сих пор.

Надеюсь, что любой может извлечь из этого выгоду.

...