【问题标题】:java.lang.IllegalStateException: HTC Android 6.0 Marshmallow crash - Google Play Snapshotsjava.lang.IllegalStateException:HTC Android 6.0 Marshmallow 崩溃 - Google Play 快照
【发布时间】:2017-04-06 08:11:13
【问题描述】:

我发布了一款适用于大多数手机(从 Android 4.X 到 7.X)的应用。但是有一个设备,HTC One M9(6.0 Marshmallow),应用程序每次都崩溃。它总是在加载主菜单并且应用程序尝试连接到 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

此外,日志中的两行在这些方法中引用了我的 MainActivity.java(此处为“Snapshots.OpenSnapshotResult open”):

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;
    }

有人知道这可能是什么原因吗?

【问题讨论】:

    标签: java android crash android-6.0-marshmallow google-play-games


    【解决方案1】:

    实时调频。如文档中所述,[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 方法以生成有效的文件名。

    【讨论】:

    • 你能解释一下我当时做错了什么吗?我没有看到我在哪里创建了不符合这些要求的快照名称?或者它不接受“Autosave HTC”中的空间?
    • @DustinKeßler Autosave HTC,不允许使用空格。
    • 为什么我在其他地方做存档游戏,叫做“手动存档点”,而且效果很好?
    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    相关资源
    最近更新 更多