如何以静默方式下载Google Play游戏服务保存的游戏快照的数据?

时间:2018-10-03 12:36:51

标签: java android google-signin google-play-games snapshot

我正在尝试在我的Android应用中将Google的保存的游戏功能与Google Play游戏服务一起使用。 Google提供了sample code how to do so

app\tmp\cache\

很明显,Google希望您使用他们提供的意图让用户决定要加载哪个已保存的游戏,或者是否应该创建一个新的保存游戏。

另一方面,我想为用户做出此决定。但是,我找不到返回快照列表和加载快照数据的方法。

由于我的游戏不需要为每个用户维护一个以上保存的游戏,因此我对无意获取快照列表(尽管这将是一个有趣的解决方案)的兴趣降低了,而对基于快照的加载兴趣不大在保存的游戏名称上,保持沉默。

如何在不显示意图的情况下加载快照?

1 个答案:

答案 0 :(得分:0)

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"));
                }
            }
        });
    }
}

我实施了一个简单的解决策略(在冲突时使用最新保存的游戏),但是我没有时间来艰难地测试所有不同的情况(例如冲突),但是到目前为止,它通过了我的简单测试。

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