调用Games.Snapshots.open(...)时出错

时间:2017-03-23 16:02:38

标签: android snapshot

我正在尝试了解已保存游戏的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();
}

0 个答案:

没有答案