web-dev-qa-db-ja.com

GMS IllegalStateException:結果はすでに設定されていますか?

先週から、このアプリについて多くの例外が発生します。GMS11.0.2を使用しています。

Fatal Exception: Java.lang.IllegalStateException: Results have already been set
   at com.google.Android.gms.common.internal.zzbo.zza(Unknown Source)
   at com.google.Android.gms.internal.zzbbl.setResult(Unknown Source)
   at com.google.Android.gms.internal.zzbbf.zzz(Unknown Source)
   at com.google.Android.gms.internal.zzbbf.zzf(Unknown Source)
   at com.google.Android.gms.internal.zzbbf.zzb(Unknown Source)
   at com.google.Android.gms.internal.zzbav.zza(Unknown Source:3)
   at com.google.Android.gms.internal.zzbdk.zzb(Unknown Source)
   at com.google.Android.gms.internal.zzbdk.zzrR(Unknown Source)
   at com.google.Android.gms.internal.zzbdk.onConnected(Unknown Source)
   at com.google.Android.gms.common.internal.zzaa.onConnected(Unknown Source)
   at com.google.Android.gms.common.internal.zzn.zzsR(Unknown Source:2)
   at com.google.Android.gms.common.internal.zze.zzy(Unknown Source)
   at com.google.Android.gms.common.internal.zzh.handleMessage(Unknown Source:4)
   at Android.os.Handler.dispatchMessage(Handler.Java:102)
   at Android.os.Looper.loop(Looper.Java:148)
   at Android.os.HandlerThread.run(HandlerThread.Java:61)

ファブリックごとのログレポート。

firebaseを使用し、GMSバージョンは11.0.2です

これらの問題をどのように確認しますか?

およびgmsバージョン11.8.0での同じ問題

Java.lang.IllegalStateException: Results have already been set

   at com.google.Android.gms.common.internal.zzbs.zza(Unknown Source)
   at com.google.Android.gms.common.api.internal.zzs.setResult(Unknown Source)
   at com.google.Android.gms.common.api.internal.zzm.zzy(Unknown Source)
   at com.google.Android.gms.common.api.internal.zzm.zzf(Unknown Source)
   at com.google.Android.gms.common.api.internal.zzm.zzb(Unknown Source)
   at com.google.Android.gms.common.api.internal.zzc.zza(Unknown Source:3)
   at com.google.Android.gms.common.api.internal.zzbr.zzb(Unknown Source)
   at com.google.Android.gms.common.api.internal.zzbr.zzakz(Unknown Source)
   at com.google.Android.gms.common.api.internal.zzbr.onConnected(Unknown Source)
25
Jamin

このハックは、Jaminとdivonasの回答に基づいています。 Crashlyticsで動作し、Crashlyticsなしで動作します。 Application onCreate()メソッドでこのメソッドを呼び出します。 Crashlyticsを使用している場合、Crashlyticsの初期化後にこのメソッドを呼び出します。ところで、UIスレッドIDは常に1であるとは限りません。

/**
 * Hack for gms bug https://issuetracker.google.com/issues/70416429
 * https://stackoverflow.com/questions/47726111/gms-illegalstateexception-results-have-already-been-set
 */
private void handleGMS70416429() {
    final Thread.UncaughtExceptionHandler defaultExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
    final long uiThreadId = Thread.currentThread().getId();
    Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {

        @Override
        public void uncaughtException(Thread t, Throwable e) {
            if (e != null && t.getId() != uiThreadId && e.getStackTrace() != null && e.getStackTrace().length > 0
                    && e.getStackTrace()[0].toString().contains("com.google.Android.gms")
                    && e.getMessage() != null && e.getMessage().contains("Results have already been set")) {
                return; // non-UI thread
            }
            if (defaultExceptionHandler != null)
                defaultExceptionHandler.uncaughtException(t, e);
        }

    });
}
5
Hexise

バグはまだ修正されていないため、BaseApplicationのonCreate()メソッドでhandleGMSException()を呼び出すか、独自のExceptionHandlerを実装します。このハックは、Hexiseのコメントで更新されたJaminの回答に基づいています。

private void handleGMSException() {
    Thread.UncaughtExceptionHandler rootHandler = Thread.getDefaultUncaughtExceptionHandler();
    Thread.setDefaultUncaughtExceptionHandler((thread, throwable) -> {
        if (!isGMSException(thread, throwable)) {
            rootHandler.uncaughtException(thread, throwable);
        }
    });
}

private boolean isGMSException(Thread thread, Throwable throwable) {
    //Check if Main Thread.
    if (throwable == null || thread.getId() == 1) return false;

    if (throwable.getStackTrace() != null && throwable.getStackTrace().length > 0
            && throwable.getStackTrace()[0].toString().contains("com.google.Android.gms")
            && throwable.getMessage().contains("Results have already been set")) {
        return true;
    }

    return false;
}
3
divonas

このバグは解決していませんが、UncaughtExceptionHandlerでキャッチしようとしています。ファブリックを使用しているので、ファブリックの後にMyUncaughtExceptionHandlerを登録して、この問題を最初に処理するかどうかを判断します。私はこの例外です。キャッチします。

//try to catch some uncaught exception
 public static boolean crashInterceptor(Thread thread, Throwable throwable) {

if (throwable == null || thread.getId() == 1) {
  //Don't intercept the Exception of Main Thread.
  return false;
}

String classpath = null;
if (throwable.getStackTrace() != null && throwable.getStackTrace().length > 0) {
  classpath = throwable.getStackTrace()[0].toString();
}

//intercept GMS Exception
if (classpath != null
    && throwable.getMessage().contains("Results have already been set")
    && classpath.contains("com.google.Android.gms")) {
  //CrashHelper.logNonFatalException();
  return true;
}

return false;
}
}
0
Jamin