1

Android 4.X에서 7.X에 이르는 대부분의 휴대 전화에서 잘 작동하는 앱을 출시했습니다. 하지만 HTC One M9 (6.0 Marshmallow)라는 장치가 하나씩 있으며 앱이 매번 충돌합니다. 메인 메뉴가로드되고 앱이 Google 게임 서비스에 연결하려고하면 항상 발생합니다. 솔직히 오류 로그를 얻지 못했습니다. 이것은 내가 무엇을 얻을 수 있습니다 :java.lang.IllegalStateException : HTC Android 6.0 Marshmallow crash - Google Play 스냅 샷

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 

또한, ("열 Snapshots.OpenSnapshotResult"여기) 이러한 방법에서 내 MainActivity.java를 참조 로그의 두 줄 :

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. [Snapshots.open] (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, boolean)

열려는 스냅 샷 파일의 이름입니다. 1에서 100 사이의 URL이 예약되지 않은 문자 (a-z, A-Z, 0-9 또는 기호 "-", ".", "_"또는 "~") 여야합니다.

그래서 makeSnapshotName 메소드를 수정하여 유효한 파일 이름을 생성하십시오.

+0

내가 잘못한 부분을 설명 할 수 있습니까? 이러한 요구 사항을 충족하지 않는 스냅 샷 이름을 어디서 만들지는 모르겠습니까? 또는 "Autosave HTC"의 공간을 허용하지 않습니까? –

+0

@ DustinKeßler'Autosave HTC', 공백은 허용되지 않습니다. – jiashie

+0

어떻게 "수동 세이브 포인트"라고 불리는 다른 곳에서 세이브 게임을 할 수 있습니까? –