我正在尝试了解已保存游戏的google api,我目前在从/向快照加载/写入时遇到问题:当我打开已连接的应用程序(从之前)时,我可以编写或加载快照没有任何问题。 但是,如果我断开连接,然后重新连接相同的帐户或尝试写入或加载,它会因此错误而崩溃:
FATAL EXCEPTION: AsyncTask #5
Process: espremea.timetowaste, PID: 27047
java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done(AsyncTask.java:300)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355)
at java.util.concurrent.FutureTask.setException(FutureTask.java:222)
at java.util.concurrent.FutureTask.run(FutureTask.java:242)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.NullPointerException: null reference
at android.os.Parcel.readException(Parcel.java:1546)
at android.os.Parcel.readException(Parcel.java:1493)
at com.google.android.gms.games.internal.IGamesService$Stub$Proxy.zza(Unknown Source)
at com.google.android.gms.games.internal.GamesClientImpl.zza(Unknown Source)
at com.google.android.gms.games.internal.api.SnapshotsImpl$2.zza(Unknown Source)
at com.google.android.gms.games.internal.api.SnapshotsImpl$2.zza(Unknown Source)
at com.google.android.gms.internal.zzaad$zza.zzb(Unknown Source)
at com.google.android.gms.internal.zzaaq.zze(Unknown Source)
at com.google.android.gms.internal.zzaaq.zzb(Unknown Source)
at com.google.android.gms.internal.zzaav.zzb(Unknown Source)
at com.google.android.gms.internal.zzaai.zzb(Unknown Source)
at com.google.android.gms.internal.zzaat.zzb(Unknown Source)
at com.google.android.gms.games.internal.api.SnapshotsImpl.open(Unknown Source)
at com.google.android.gms.games.internal.api.SnapshotsImpl.open(Unknown Source)
at espremea.timetowaste.MainActivity$5.doInBackground(MainActivity.java:306)
at espremea.timetowaste.MainActivity$5.doInBackground(MainActivity.java:298)
at android.os.AsyncTask$2.call(AsyncTask.java:288)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:818)
当我尝试打开快照时发生错误: Snapshots.OpenSnapshotResult open = Games.Snapshots.open( mGoogleApiClient,snapshotName,true).await();
以下是我实施的方法,问我是否错过了其他一些重要的方法并感谢;)
private String mCurrentSaveName = "test";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Create the Google Api Client with access to the Play Game and Drive services.
mGoogleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestScopes(Games.SCOPE_GAMES)
.requestScopes(Drive.SCOPE_APPFOLDER) // Drive API
.requestEmail()
.build();
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
.addConnectionCallbacks(this)
//.addOnConnectionFailedListener(this)
.addApi(Auth.GOOGLE_SIGN_IN_API, mGoogleSignInOptions)
.addApi(Games.API)
.addApi(Drive.API)
.build();
(buttons to call either loadfromSnapshot or savedGameUpdate)
SignInButton signInButton = (SignInButton) findViewById(R.id.sign_in2_button);
signInButton.setSize(SignInButton.SIZE_STANDARD);
findViewById(R.id.sign_in2_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_IN);
}
});
findViewById(R.id.sign_out_button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Games.signOut(mGoogleApiClient);
}
})
}
protected void onActivityResult(int requestCode, int resultCode,
Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_IN) {
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
handleSignInResult(result);//Do stuff.
if (resultCode == RESULT_OK) {
mGoogleApiClient.connect();
}
}
}
//Not important here...
private void handleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
mAcct = result.getSignInAccount();
testText.setText(mAcct.getDisplayName());//Show user name
} else {
}
}
void loadFromSnapshot() {
AsyncTask<Void, Void, Integer> task = new AsyncTask<Void, Void, Integer>() {
@Override
protected Integer doInBackground(Void... params) {
// Open the saved game using its name. => where the bug occures
Snapshots.OpenSnapshotResult result = Games.Snapshots.open(mGoogleApiClient,
mCurrentSaveName, true).await();
// Check the result of the open operation
if (result.getStatus().isSuccess()) {
Snapshot snapshot = result.getSnapshot();
// Read the byte content of the saved game and display it
try {
byte[] SaveGameData = snapshot.getSnapshotContents().readFully();
String test = new String(SaveGameData);
setData(test);
} catch (IOException e) {
Log.e("TAG", "Error while reading Snapshot.", e);
}
} else {
Log.e("TAG", "Error while loading: " + result.getStatus().getStatusCode());
}
return result.getStatus().getStatusCode();
}
};
task.execute();
}
private void savedGamesUpdate() {
final boolean createIfMissing = true;
// Use the data from getData() as the new Snapshot data.
final byte[] data = getData().getBytes();
AsyncTask<Void, Void, Boolean> updateTask = new AsyncTask<Void, Void, Boolean>() {
@Override
protected Boolean doInBackground(Void... params) {
//=> where the bug occures
Snapshots.OpenSnapshotResult open = Games.Snapshots.open(
mGoogleApiClient, mCurrentSaveName, createIfMissing).await();
if (!open.getStatus().isSuccess()) {
Log.w("TAG", "Could not open Snapshot for update.");
return false;
}
// Change data but leave existing metadata
Snapshot snapshot = open.getSnapshot();
snapshot.getSnapshotContents().writeBytes(data);
Snapshots.CommitSnapshotResult commit = Games.Snapshots.commitAndClose(
mGoogleApiClient, snapshot, SnapshotMetadataChange.EMPTY_CHANGE).await();
if (!commit.getStatus().isSuccess()) {
Log.w("TAG", "Failed to commit Snapshot.");
return false;
}
// No failures
return true;
}
};
updateTask.execute();
}