1

我有一個應用程序發佈,適用於從Android 4.X到7.X的各種手機。但有一個設備,HTC One M9(6.0棉花糖)和應用程序每次崩潰。當主菜單加載並且應用程序嘗試連接到Google Play遊戲服務時,它總是會發生。說實話,我沒有得到錯誤日誌。這就是我得到:java.lang.IllegalStateException:宏達Android 6.0棉花糖崩潰 - 谷歌播放快照

java.lang.RuntimeException: An error occurred while executing doInBackground() 
    at android.os.AsyncTask$3.done(AsyncTask.java:309) 
    at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:354) 
    at java.util.concurrent.FutureTask.setException(FutureTask.java:223) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:234) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588) 
    at java.lang.Thread.run(Thread.java:818) 
Caused by: java.lang.IllegalStateException: Must provide a valid file name! 
    at android.os.Parcel.readException(Parcel.java:1616) 
    at android.os.Parcel.readException(Parcel.java:1561) 
    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.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 com.duke.privatpc.quiztest.MainActivity$2.doInBackground(MainActivity.java:362) 
    at com.duke.privatpc.quiztest.MainActivity$2.doInBackground(MainActivity.java:357) 
    at android.os.AsyncTask$2.call(AsyncTask.java:295) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    ... 4 more 

而且,兩條線在日誌中提到我的MainActivity.java這些方法中(在這裏「Snapshots.OpenSnapshotResult打開」):

private void savedGamesUpdate() { 
     final String snapshotName = makeSnapshotName(APP_STATE_KEY); 
     final boolean createIfMissing = true; 

     // Use the data from the EditText as the new Snapshot data. 
     final byte[] data = mSaveGameData; 

     AsyncTask<Void, Void, Boolean> updateTask = new AsyncTask<Void, Void, Boolean>() { 


      @Override 
      protected Boolean doInBackground(Void... params) { 
       Snapshots.OpenSnapshotResult open = Games.Snapshots.open(
         mGoogleApiClient, snapshotName, createIfMissing).await(); 

       if (!open.getStatus().isSuccess()) { 
        return false; 
       } 

       Bitmap coverImage = BitmapFactory.decodeResource(MainActivity.this.getResources(), 
         R.mipmap.autosave); 
       String desc = "Autosave "+android.os.Build.MODEL; 
       // Create the change operation 
       SnapshotMetadataChange metadataChange = new SnapshotMetadataChange.Builder() 
         .setCoverImage(coverImage) 
         .setDescription(desc) 
         .build(); 

       // Change data but leave existing metadata 
       Snapshot snapshot = open.getSnapshot(); 
       snapshot.getSnapshotContents().writeBytes(data); 

       Snapshots.CommitSnapshotResult commit = Games.Snapshots.commitAndClose(
         mGoogleApiClient, snapshot, metadataChange).await(); 

       if (!commit.getStatus().isSuccess()) { 
        return false; 
       } 

       // No failures 
       return true; 
      } 

      @Override 
      protected void onPostExecute(Boolean result) { 
       dismissProgressDialog(); 

      } 
     }; 
     updateTask.execute(); 
    } 

這一個:

private String makeSnapshotName(int appStateKey) { 
     if(isAnHTCDevice()){ 
      return "Autosave HTC"; 
     }else{ 
      if(android.os.Build.MODEL != null){ 
       return "Autosave"+android.os.Build.MODEL; 
      }else{ 
       return "Autosave"; 
      } 
     } 

    } 

    public boolean isAnHTCDevice() 
    { 
     String manufacturer = android.os.Build.MANUFACTURER; 
     if (manufacturer.toLowerCase().contains("htc")) 
      return true; 
     else 
      return false; 
    } 

任何人都知道這可能是什麼原因?

回答

0

RTFM。如文檔中所述,[快照。打開](https://developers.google.com/android/reference/com/google/android/gms/games/snapshot/Snapshots.html#open(com.google.android.gms.common.api.GoogleApiClient,java.lang.String,布爾值))

要打開的快照文件的名稱。必須介於1到100個非URL保留字符(a-z,A-Z,0-9或符號「 - 」,「。」,「_」或「〜」)。

所以,修改makeSnapshotName方法來生成一個有效的文件名。

+0

你能解釋一下我在哪裏做錯了嗎?我沒有看到我創建的快照名稱不符合這些要求?還是不接受「Autosave HTC」的空間? –

+0

@DustinKeßler'Autosave HTC',不允許有空格。 – jiashie

+0

爲什麼我在其他稱爲「手動保存點」的地方保存遊戲並且工作正常? –