簡體   English   中英

如何以靜默方式下載Google Play游戲服務保存的游戲快照的數據?

[英]How to download a Google Play Games Services Saved Games Snapshot's Data, silently?

我正在嘗試在我的Android應用中將Google的“保存的游戲”功能與Google Play游戲服務一起使用。 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希望您使用他們提供的意圖讓用戶決定要加載哪個已保存的游戲,或者是否應該創建一個新的保存游戲。

另一方面,我想為用戶做出此決定。 但是,我找不到返回快照列表和加載快照數據的方法。

由於我的游戲不需要為每個用戶維護一個以上的已保存游戲,因此我對無意獲取快照列表的興趣較小(盡管這將是一個有趣的解決方案),而對基於名稱加載快照的興趣不大靜默保存的游戲。

如何加載快照而不顯示意圖?

傑西(Jess)的評論使我提出了一個現已過時的解決方案。 但是,發布答案的人指出,Google提供的CollectAllTheStars示例應用程序中還有一個可行的解決方案。 我很想檢查這個示例應用程序,以了解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"));
                }
            }
        });
    }
}

我實施了一個簡單的解決策略(在沖突時使用最新保存的游戲),但是我沒有時間來艱難地測試所有不同的情況,例如沖突,但是到目前為止,它已經通過了我的簡單測試。

希望任何人都可以從中受益。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM