web-dev-qa-db-ja.com

Android ChromeCast RuntimeException:リモートロードに失敗しました。ローカルフォールバックが見つかりません

アプリケーションでキャスト機能を使用しています。正常に動作していましたが、突然Playストアコンソールでクラッシュの数が増加していることがわかりました。

ガイドラインで定義されているようにCastContextを適切に初期化しています。さらに、このメソッドCastContext.getSharedInstance(context)を呼び出す前に、デバイスに互換性があるかどうかを確認しています。これは問題にはなりません。

Google-play-servicesの有無にかかわらず、エミュレーターでもこのクラッシュを再現することはできません。

どんな助けでもありがたいです。

クラッシュ:

致命的な例外:Java.lang.RuntimeException:アクティビティを開始できませんComponentInfo {... .activity.TVActivityPhone}:Java.lang.RuntimeException:com.google.Android.gms.dynamite.DynamiteModule $ zza:リモートロードに失敗しました。ローカルフォールバックが見つかりません。 Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:2677)at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2747)at Android.app.ActivityThread.access $ 900(ActivityThread.Java:187)at Android.app .ActivityThread $ H.handleMessage(ActivityThread.Java:1584)at Android.os.Handler.dispatchMessage(Handler.Java:111)at Android.os.Looper.loop(Looper.Java:194)atAndroid.app.ActivityThread。 main(ActivityThread.Java:5877)at Java.lang.reflect.Method.invoke(Method.Java)at Java.lang.reflect.Method.invoke(Method.Java:372)at com.Android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.Java:1020)at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:815)Java.lang.RuntimeExceptionが原因:com.google.Android.gms.dynamite.DynamiteModule $ zza:リモートロードに失敗しました。ローカルフォールバックが見つかりません。

Codeif内でエラーが発生します。これは、GooglePlay開発者サービスの可用性に関するものではないことを意味します。

   if (googlePlayServicesVerified(context)) {  // checking (result==ConnectionResult.SUCCES)
      Log.d("TAG", "instantiated");
      castContext = CastContext.getSharedInstance(context);
    } else {
      Log.e(TAG, "FAILED");
    }

グーグルにバグを提出:

https://issuetracker.google.com/issues/65359941

**更新**次の2つの問題を確認してください。

https://issuetracker.google.com/issues/65359941https://issuetracker.google.com/issues/794059

一時的な解決策は私の答えにあります。

14
sam_k

これは一時的な解決策です。

1)Cast APIを使用する前に、アプリは常にGPSバージョンを確認する必要があります

2)CastContext.getSharedInstance()が失敗するのを許可します。おそらく例外をスロー/キャッチします(またはnullを返します)。

3)ダイナマイトモジュールのロードに失敗しても、何も壊さないように注意してください。 MiniControllerFragmentなど、CastContext.getSharedInstance()を呼び出す暗黙的に初期化されるUIウィジェットがいくつかあります。ダイナマイトのロードに失敗した場合は、クラッシュさせないようにする必要があります。

 public static boolean isAvailable(Context context)
    {
        GoogleApiAvailability availability = GoogleApiAvailability.getInstance();

        return isGooglePlayServicesAvailable(context, availability) &&
                isCastContextAvailable(context);
    }

public static boolean isAvailable(Context context) {
  if (googlePlayServicesVerified(context)) {
    try {
      castContext = CastContext.getSharedInstance(context);
      Log.d(TAG, "CastContext instantiated");
    } catch (Exception e) {
      Log.report(e);
      castContext = null;
    }
  } else {
    CrashReporter.report("CastContext FAILED to be instantiated : googlePlayServicesVerified() has failed."));
    castContext = null;
  }
}
3
sam_k