如何静默下载 Google Play Games Services Saved Games Snapshot 的数据?
How to download a Google Play Games Services Saved Games Snapshot's Data, silently?
我正在尝试在我的 Android 应用中将 Google 的已保存游戏功能与 Google Play 游戏服务结合使用。 Google 提供 sample code how to do so:
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 希望您使用他们提供的意图让用户决定加载哪个保存的游戏,或者是否应该创建一个新的保存游戏。
另一方面,我想为用户做这个决定。但是,我无法找到 return 快照列表和加载快照数据的方法。
由于我的游戏不需要为每个用户保存一个以上的游戏,所以我对无意中获取快照列表不太感兴趣(不过这将是一个有趣的解决方案),而更感兴趣的是加载一个根据游戏存档名称截图,默默
如何在不显示意图的情况下加载快照?
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"));
}
}
});
}
}
我实施了一个简单的解决策略(在冲突时使用最新保存的游戏),但我没有时间对冲突等所有不同情况进行严格测试,但到目前为止它通过了我的简单测试。
希望任何人都能从中受益。
我正在尝试在我的 Android 应用中将 Google 的已保存游戏功能与 Google Play 游戏服务结合使用。 Google 提供 sample code how to do so:
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 希望您使用他们提供的意图让用户决定加载哪个保存的游戏,或者是否应该创建一个新的保存游戏。
另一方面,我想为用户做这个决定。但是,我无法找到 return 快照列表和加载快照数据的方法。
由于我的游戏不需要为每个用户保存一个以上的游戏,所以我对无意中获取快照列表不太感兴趣(不过这将是一个有趣的解决方案),而更感兴趣的是加载一个根据游戏存档名称截图,默默
如何在不显示意图的情况下加载快照?
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"));
}
}
});
}
}
我实施了一个简单的解决策略(在冲突时使用最新保存的游戏),但我没有时间对冲突等所有不同情况进行严格测试,但到目前为止它通过了我的简单测试。
希望任何人都能从中受益。