Google Play已保存的游戏 - 大量冲突

时间:2016-07-20 19:42:52

标签: android google-play-games

我目前遇到的问题是我的应用会产生巨大的数量的冲突。我无法弄清楚是什么导致这些冲突发生。只要我在一台设备上使用该应用程序,它似乎就可以了,但是每隔一段时间它就会不断出现冲突。

我使用以下代码打开快照。我打电话给$blah = count($_FILES['item_image']['name']); echo "number is $blah"; 来阅读和写快照。

openSnapshot

这种合并的示例logcat将是:

private Pair<Boolean, Snapshot> openSnapshot(GoogleApiClient googleApiClient) {
    Snapshots.OpenSnapshotResult result = Games.Snapshots.open(googleApiClient, "save", true).await();
    return processSnapshotResult(result, googleApiClient);
}

private Pair<Boolean,Snapshot> processSnapshotResult(Snapshots.OpenSnapshotResult result, GoogleApiClient googleApiClient) {
    final int statusCode = result.getStatus().getStatusCode();
    if (statusCode == GamesStatusCodes.STATUS_SNAPSHOT_CONFLICT) {
        Log.d("Snapshot", "Snapshot conflict detected.");
        final String conflictId = result.getConflictId();
        final Snapshot conflictingSnapshot = result.getConflictingSnapshot();
        final Snapshot snapshot = result.getSnapshot();

        try {
            final SnapshotContents snapshotContents = snapshot.getSnapshotContents();
            if (snapshotContents != null) {
                final byte[] readFully = snapshotContents.readFully();
                database.mergeWith(activity, SavedInstance.this, readFully,false);
                Log.d("Snapshot", "Merged 1");
            } else {
                Log.d("Snapshot", "Merge 1 was null");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        try {
            final SnapshotContents snapshotContents = conflictingSnapshot.getSnapshotContents();
            if (snapshotContents != null) {
                final byte[] readFully = snapshotContents.readFully();
                database.mergeWith(activity, SavedInstance.this, readFully,false);
                Log.d("Snapshot", "Merged 2");
            } else {
                Log.d("Snapshot", "Merge 2 was null");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        Log.d("Snapshot", "Resolving " + conflictId);
        /*Snapshot newSnapshot = */Games.Snapshots.resolveConflict(
                googleApiClient, conflictId, snapshot).await().getSnapshot();

        Log.d("Snapshot", "Resolved " + conflictId);
        return new Pair<>(true,openSnapshot(googleApiClient).second);
    } else if (statusCode == GamesStatusCodes.STATUS_SNAPSHOT_CONTENTS_UNAVAILABLE) {
        return new Pair<>(false,result.getSnapshot());
    } else if (statusCode == GamesStatusCodes.STATUS_OK) {
        return new Pair<>(false,result.getSnapshot());
    } else {
        return new Pair<>(null,null);
    }
}

这通常会持续5到30分钟。

可能导致大量冲突的原因是什么?

(如果需要更多代码,请告诉我。)

1 个答案:

答案 0 :(得分:0)

Handling saved game conflicts中,您的游戏必须通过选择一个提供的版本或合并以下两个已保存游戏版本的数据来决定如何解决冲突:

  
      
  • Google Play游戏服务所知的最新版本准确无误;和
  •   
  • 在其中一个播放器设备上检测到包含冲突内容或元数据的修改版本。这可能与您尝试保存的版本不同。
  •   

在检测到您已完成的已保存游戏冲突后,您还需要修改已保存的游戏以解决冲突,尤其是如果要合并来自两个已保存游戏的数据或修改现有快照以保存到服务器作为已解决的最终游戏版。下面列出了以下步骤:

  
      
  1. SnapshotgetConflictingSnapshot()选择一个getSnapshot()对象作为您的基础。
  2.   
  3. 接下来,致电Snapshots.resolveConflict()并传入您在上一步中选择的Snapshot。这会将Snapshot存储到服务器。
  4.   
  5. 致电open()以检索您刚刚在上一步中存储的Snapshot。现在对返回的Snapshot进行修改,然后调用Snapshots.commitAndClose()将修改后的保存游戏上传到服务器。
  6.   

可以在给定的文档中找到更多信息和示例代码段。

我希望有所帮助。