AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ZoomTableManager


133

Moja aplikacja korzystająca z Google Maps SDK (v2) właśnie zaczęła się zawieszać z tym wyjątkiem:

Process: com.currentlocation.android, PID: 7328
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
        at com.google.maps.api.android.lib6.gmm6.vector.ct.<init>(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):9)
        at com.google.maps.api.android.lib6.gmm6.vector.cv.a(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):23)
        at com.google.maps.api.android.lib6.gmm6.util.m.run(:com.google.android.gms.dynamite_mapsdynamite@201216081@20.12.16 (120400-0):14)
        at java.lang.Thread.run(Thread.java:919)

W v3 beta SDK, ślad stosu to:

2020-04-23 15:59:06.064 E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example, PID: 22717
    java.lang.ArrayIndexOutOfBoundsException: length=1; index=12
        at com.google.android.libraries.maps.bv.zzbs.<init>(ZoomTable.java:24)
        at com.google.android.libraries.maps.bv.zzbv.zza(ZoomTableQuadTree.java:57)
        at com.google.android.libraries.maps.br.zzd.zza(Unknown Source:4)
        at com.google.android.libraries.maps.hi.zzas.zza(Suppliers.java:7)
        at com.google.android.libraries.maps.br.zza.zzh(SharedMapComponentImpl.java:58)
        at com.google.android.libraries.maps.gu.zzat.zza(RendererFactoryImpl.java:88)
        at com.google.android.libraries.maps.it.zzav.zza(GoogleMapImpl.java:59)
        at com.google.android.libraries.maps.it.zzci.zza(MapFragmentDelegateImpl.java:3)
        at com.google.android.libraries.maps.it.zzcg.zza(MapFragmentDelegateImpl.java:15)
        at com.google.android.libraries.maps.SupportMapFragment$zza.onCreateView(SupportMapFragment.java:15)
        at com.google.android.gms.dynamic.zae.zaa(com.google.android.gms:play-services-base@@17.1.0:4)
        at com.google.android.gms.dynamic.DeferredLifecycleHelper.zaa(com.google.android.gms:play-services-base@@17.1.0:9)
        at com.google.android.gms.dynamic.DeferredLifecycleHelper.onCreateView(com.google.android.gms:play-services-base@@17.1.0:25)
        at com.google.android.libraries.maps.SupportMapFragment.onCreateView(SupportMapFragment.java:34)
        at androidx.fragment.app.Fragment.performCreateView(Fragment.java:2698)
        at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:310)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1185)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
        at androidx.fragment.app.FragmentManager.addAddedFragments(FragmentManager.java:2222)
        at androidx.fragment.app.FragmentManager.executeOpsTogether(FragmentManager.java:1995)
        at androidx.fragment.app.FragmentManager.removeRedundantOperationsAndExecute(FragmentManager.java:1951)
        at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1847)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2621)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.Fragment.performActivityCreated(Fragment.java:2722)
        at androidx.fragment.app.FragmentStateManager.activityCreated(FragmentStateManager.java:336)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1186)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
        at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
        at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
        at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
        at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2569)
        at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:247)
        at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:541)
        at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:201)
        at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1432)
        at android.app.Activity.performStart(Activity.java:7848)
        at android.app.ActivityThread.handleStartActivity(ActivityThread.java:3294)
2020-04-23 15:59:06.064 E/AndroidRuntime:     at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
        at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
        at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
        at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2016)
        at android.os.Handler.dispatchMessage(Handler.java:107)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7356)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:930)

Jaka jest przyczyna?


10
Może to problem z Mapami Google
Eduardo Herzer

1
Czy to aplikacja produkcyjna czy tylko test?
user961186

18
Uwaga: Nie publikuj odpowiedzi „ja też” na to pytanie. Tylko odpowiedzi, które odpowiadają na pytanie, powinny być zamieszczane jako odpowiedzi.
Wai Ha Lee

3
aktualizacje będą tutaj: Issuetracker.google.com/issues/154855417
Lewkka

2
@MidnightGuest Jeśli rozwiniesz to nieco, może to być dobre pytanie.
Makyen

Odpowiedzi:


83

Edycja : poniżej znajduje się oficjalne rozwiązanie od Google ( link )

Podsumowanie

Wątek zestawu SDK Map Google zawiesza się Aplikacja (ArrayIndexOutOfBoundsException) - oferowane rozwiązanie

Opis

W dniu 23 kwietnia 2020 r., O godzinie 11:30 PDT , Google przez 4 godziny aktualizował konfigurację komponentu mobilnego Maps, powodując awarie w pakietach SDK do map na Androida i iOS. Aplikacje na urządzeniach, które pobrały tę wersję konfiguracji (w okresie wyłączenia) były podatne na awarię. Rozwiązania obejścia są oferowane dla Maps SDKs dla Androida i iOS.

Maps SDK dla Androida

Maps SDK dla Androida v2 (zawarte w usługach Google Play)

Aktualizacje usług Google Play w celu naprawienia awarii zostały opublikowane na wszystkich urządzeniach z usługami Google Play w wersji 17.4.55 i nowszych. Po zainstalowaniu aktualizacji w urządzeniu nie ma zmiany numeru wersji usług Google Play. Programiści ani użytkownicy końcowi nie muszą podejmować żadnych działań, aby otrzymać zaktualizowany moduł Map; programiści mogą jednak sprawdzić, czy moduł jest obecny na danym urządzeniu za pomocą następującego polecenia adb:

adb shell dumpsys activity provider com.google.android.gms.chimera.container.GmsModuleProvider

Powinieneś zobaczyć linię Module Set ID: mapswymienioną w Module Setssekcji.

Module Set ID: maps, Module Set Version: 2015120015120000

Częstotliwość awarii Maps SDK dla Androida v2 wróciła do normy.

Na razie, jeśli nie zaktualizowałeś swojej aplikacji o opisane poniżej obejścia kodu po stronie klienta, nie musisz podejmować dalszych działań.

Jeśli aplikacja została już zaktualizowana za pomocą obejść, możesz usunąć to obejście w kolejnej aktualizacji aplikacji (ale zachowanie tego obejścia jest bezpieczne).

Pakiet abonamentowy Maps SDK dla Androida v2 lub Maps SDK dla Androida v3 beta (biblioteki statyczne)

Jeśli Twoja aplikacja korzysta z pakietu Premium Plan Maps SDK dla systemu Android v2 lub Maps SDK dla systemu Android v3 w wersji beta (biblioteki statyczne) i nadal występują awarie, nadal zalecamy wdrożenie poniższych obejść poprzez aktualizację aplikacji. Ponieważ aplikacja ładuje statyczną wersję zestawu SDK, która jest podatna na złe dane przechowywane na niektórych urządzeniach, tylko aktualizacja aplikacji może rozwiązać problem.

Zatwierdzenia recenzji w Sklepie Play

Jeśli aktualizujesz aplikację, ale występują opóźnienia w zatwierdzaniu recenzji w Sklepie Play, prześlij zgłoszenie do pomocy technicznej, podając identyfikator aplikacji: ⁠ Skontaktuj się z zespołem pomocy technicznej . Nasz Zespół Wsparcia wewnętrznie eskaluje twoją prośbę i przyspieszy zatwierdzenie.

Negatywne recenzje w sklepie Google Play

Niektórzy twórcy aplikacji pytali o recenzje 1-gwiazdkowe w Sklepie Google Play pozostawione przez użytkowników końcowych z powodu awarii. Tylko komentarze naruszające zasady Google Play [1] można usunąć. Możesz także oflagować obraźliwe recenzje w konsoli Play [2]. Aplikacje nie zostaną automatycznie usunięte ze sklepu Google Play z powodu negatywnych recenzji. Warto również zauważyć, że obliczenie ogólnej oceny recenzji aplikacji faworyzuje ostatnie recenzje, co oznacza, że ​​z czasem twoja ocena powróci do poziomu sprzed incydentu.

[1] ⁠ Oceny i przegląd w Sklepie Play

[2] ⁠ Zgłoś nieodpowiednie recenzje

Maps SDK dla iOS

Awarie w systemie iOS wróciły do ​​normy. Jeśli w aplikacji nadal występują awarie, musisz zaktualizować i opublikować aplikację, korzystając z przedstawionych tutaj obejść kodu.

W przypadku pytań dotyczących wdrażania lub przyspieszania aplikacji w Apple App Store skontaktuj się bezpośrednio z Apple.


Dzięki tej aktualizacji zamykamy ten problem. Dziękujemy wszystkim za cierpliwość. Nasz zespół przeprowadza dogłębne wewnętrzne dochodzenie w sprawie tego incydentu; tak szybko, jak to możliwe, opublikujemy naszą analizę (za około tydzień). W międzyczasie, jeśli masz jakieś pytania lub nadal masz problemy, ⁠ złóż zgłoszenie do pomocy technicznej .

Obejścia:

  • Użytkownicy końcowi na Androidzie mogą wyczyścić dane aplikacji, której dotyczy problem (nie tylko pamięć podręczną).

  • Użytkownicy końcowi w systemie iOS mogą odinstalować, a następnie ponownie zainstalować aplikacje, których dotyczy problem.

  • Programiści aplikacji mogą zastosować poniższe obejścia kodu, aby rozwiązać problem dla wszystkich swoich użytkowników końcowych.

Obejście kodu dla systemu iOS:

Zalecane umieszczenie kodu jest przed inicjalizacją GMSServices w aplikacji (_: didFinishLaunchingWithOptions :) (Swift) lub aplikacji: didFinishLaunchingWithOptions: (Objective-C). Konkretnie:

Szybki:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Cel C:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL];
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

Obejście kodu dla Androida:

Zalecane miejsce dla kodu znajduje się w Application.onCreate ():

Jawa

try {
  SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
  if (!hasFixedGoogleBug154855417.contains("fixed")) {
    File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
    File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
    File corruptedClientParametersData =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data."
              + getBaseContext().getPackageName());
    File corruptedClientParametersDataV1 =
        new File(
          getFilesDir(),
          "DATA_ServerControlledParametersManager.data.v1."
              + getBaseContext().getPackageName());
    corruptedZoomTables.delete();
    corruptedSavedClientParameters.delete();
    corruptedClientParametersData.delete();
    corruptedClientParametersDataV1.delete();
    hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
  }
} catch (Exception e) {

}

Kotlin

try {
    val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!sharedPreferences.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data")
        val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
        val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
        val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
        corruptedZoomTables.delete()
        corruptedSavedClientParameters.delete()
        corruptedClientParametersData.delete()
        corruptedClientParametersDataV1.delete()
        sharedPreferences.edit().putBoolean("fixed", true).apply()
    }
} catch (exception: Exception) {

}

Przedstawione tutaj obejścia obejmują wszystkie dostępne smaki i wersje naszych zestawów SDK dla Androida. W celu dalszego wyjaśnienia (w przypadku zwolnienia wcześniejszej wersji obejścia, które nie usunęło tylu plików):

  • Aplikacje korzystające z aplikacji Android Android SDK v2 powinny usunąć tylko jeden plik: ZoomTables.data.
  • Aplikacje korzystające z aplikacji Android Android SDK v3 w wersji beta powinny również wymagać usunięcia tylko jednego pliku

    DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) lub

    DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())


1
Nasza aplikacja działa na emulatorze, na tym samym kodzie, ale nie na urządzeniu produkcyjnym. Zaczęło się dziać podczas powiększania. FATAL EXCEPTION: androidmapsapi-ZoomTableManager
user961186

1
Błąd dotyczy Androida.
user961186

2
Właśnie sprawdziłem, że wiele aplikacji korzystających z Map ulega awarii, w tym Uber, Lyft itp. Mapy Google wydają się działać dla mnie, musi wskazywać inny punkt końcowy interfejsu API inny niż publiczny interfejs API.
AlexVPerl

16
Prawdziwe przestępstwo polega na tym, że nawet gdy wywołanie mapy jest zawarte w instrukcji try / catch, Mapy Google w jakiś sposób zastępują połączenie try i powodują awarię aplikacji zamiast generowania błędu. Mapy powinny zgłaszać wyjątek, gdy nie jest dostępny, a nie tylko zawieszać wszystko.
Brettins

2
ten sam problem w Pakistanie
Syed Raza Mehdi

44

Wygląda na to, że w każdej aplikacji Google Map tworzy plik ZoomTables.data.

wprowadź opis zdjęcia tutaj

Ten plik miał zniekształconą, zniekształconą wersję, którą można pobrać z komentarza . Aby odtworzyć problem, usuń ZoomTables.data z pakietów aplikacji na urządzeniu i wstaw zniekształcony. Aplikacja powinna ulec awarii.

Obecnie problem został rozwiązany po stronie Google, ale aplikacje nadal zawierają buforowaną wersję tego pliku danych. Aby rozwiązać ten problem, powinniśmy usunąć ten plik bezpośrednio z poziomu aplikacji uruchamianej w aplikacji Application onCreate Method.

private void fixGoogleMapBug() {
  try {
    SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
    if (!hasFixedGoogleBug154855417.contains("fixed")) {
      File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
      File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
      File corruptedClientParametersData =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data."
                + getBaseContext().getPackageName());
      File corruptedClientParametersDataV1 =
          new File(
            getFilesDir(),
            "DATA_ServerControlledParametersManager.data.v1."
                + getBaseContext().getPackageName());
      corruptedZoomTables.delete();
      corruptedSavedClientParameters.delete();
      corruptedClientParametersData.delete();
      corruptedClientParametersDataV1.delete();
      hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
    }
  } catch (Exception e) {

  }
}

Aktualizacja 1

Zaktualizowałem obejście na podstawie najnowszego komentarza programistów Google :

Przedstawione tutaj obejścia obejmują wszystkie dostępne smaki i wersje naszych zestawów SDK dla Androida. W celu dalszego wyjaśnienia (w przypadku zwolnienia wcześniejszej wersji obejścia, które nie usunęło tylu plików):

Aplikacje korzystające z aplikacji Android Android SDK v2 powinny usunąć tylko jeden plik: ZoomTables.data. Aplikacje korzystające z aplikacji Android Android SDK v3 beta powinny usunąć tylko jeden plik, DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) lub DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())


2
Wyłączenie pliku ZoomTables.data działało dla mnie. Wielkie dzięki! Każdy powinien tego użyć i zaznaczyć jako odpowiedź!
Eduardo Herzer

@ArthurAttout Tak, raczej robię to na razie i naprawiam aplikacje produkcyjne, które są zawieszone ponad 16 godzin, niż czekam na więcej czasu na poprawki Google
Eduardo Herzer

@EduardoHerzer ETA Google'a wynosi 48 godzin, a pełne wdrożenie produkcji potrwa ponad 48 godzin. (Zaktualizuj czas przeglądu + czas wdrożenia)
Muhammad Saqib

To zadziałało dla mnie! Zmieniłem tylko trochę dla mojej aplikacji Flutter: var dir = czekaj na getApplicationSupportDirectory (); Plik corruptZoomTables = nowy plik (dir.path + "/ZoomTables.data");
csk

Dlaczego usuwamy ZoomTables.data tylko raz? Co się stanie, jeśli zostanie to ponownie uszkodzone w przyszłości?
Jan Nepraš

11

To rozwiązanie działało dla mnie

  1. Najpierw otwórz „Informacje o aplikacji”
  2. Wybierz „Pamięć”
  3. Kliknij „Wyczyść dane”
  4. Otwórz aplikację ponownie i sprawdź, czy problem został rozwiązany.

    Poniżej znajdują się sugestie, które mają pomóc Twoim klientom.

  5. Wyślij wiadomość e-mail do wszystkich użytkowników w związku z niedogodnościami i opisz im napotkany problem, podając wyżej wymienione kroki w celu rozwiązania problemu.

  6. Możesz również wysyłać powiadomienia wypychane do wszystkich użytkowników za pomocą powiadomień push Firebase, jeśli Twoja aplikacja ma usługę powiadomień wypychanych.

Demonstracja zrzutów ekranu:

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj

wprowadź opis zdjęcia tutaj


6

W przypadku Androida wielu programistów wspomniało o obejściu polegającym na usunięciu pliku ZoomTable.data bezpośrednio z ich aplikacji. Po sprawdzeniu poprawka wydaje się bezpieczna i można ją wypróbować w aplikacji.

Należy zapoznać się https://issuetracker.google.com/154855417#comment179

Jeśli chcesz, aby użytkownicy nadal korzystali z Twojej aplikacji bez ponownej instalacji, przykładowy kod jest wklejany tutaj dla Twojej wygody. W Application.onCreate () :

SharedPreferences googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
if (!googleBug.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
}

odniesienie: Google Maps SDK ulega awarii - częściowo rozwiązany



6

Wady powyższych rozwiązań:

  • ZoomTables.data jest usuwany na każdym urządzeniu, niezależnie od tego, czy awaria dotyczy tego urządzenia, czy nie
  • Obejście działa tylko raz, czy na pewno ten problem się nie powtórzy?

Wady mojego rozwiązania:

  • przy pierwszym wykonaniu mapy aktywność na dotkniętym urządzeniu mapa jest pusta. Po obróceniu urządzenia lub wyświetleniu drugiej mapy pojawi się mapa

Moje rozwiązanie wychwytuje wyjątek zgłoszony przez Maps SDK, nazwij to w onCreate klasy Application:

public static void catchGoogleMapsException(final Context context)
{
  final Thread.UncaughtExceptionHandler defaultHandler =
    Thread.getDefaultUncaughtExceptionHandler();
  Thread.setDefaultUncaughtExceptionHandler(
    (@NonNull final Thread thread, @NonNull final Throwable ex) ->
    {
      if (thread.getName().contains("ZoomTableManager"))
      {
        new File(context.getFilesDir(), "ZoomTables.data").delete();
        Log.w("Maps Bug 154855417", "Caught exception and deleted ZoomTables.data");
      }
      else
        if (defaultHandler!=null)
          defaultHandler.uncaughtException(thread, ex);
        else
          throw new RuntimeException(
            "No default uncaught exception handler.", ex);
    });
}

Właśnie wypuściłem podobne obejście. Ponieważ mam w swojej aplikacji alternatywne źródła mapowania do Google, zmieniam domyślne źródło na inne niż Google, a także daję użytkownikowi komunikat wyjaśniający, co zostało zrobione. Mam nadzieję, że zapewni mi bezpieczeństwo, jeśli Google zdoła zrobić coś podobnego w przyszłości. Spodziewam się, że testy się poprawią.
Ifor

Musiałem wyczyścić pamięć, aby rozwiązać ten problem. Z jakiegokolwiek powodu usunięcie ZoomTables.data nie wystarczyło, aby rozwiązać ten problem. Usunąłem operację uruchamiania onCreate (). Chyba powinienem przyjrzeć się zakresowi obsługi wyjątków.
ShellDude

3

Uważamy, że główna przyczyna awarii pakietu Google Maps SDK została naprawiona. Poprawka jest propagowana do aplikacji, których dotyczy problem, i nadal dąży do rozwiązania w oczekiwanym tempie. Pełna rozdzielczość ma zostać zakończona do czwartku, 2020-04-23 19:45 US / Pacific.

Wersja produkcyjna została naprawiona (po stronie Google), ale jeśli nadal masz problemy ze swoim emulatorem, musisz uruchomić następujący kod tylko raz.

MainActivity.kt

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    fixGoogleMapBugTemp()   //TODO: Then clean this line

//  ...  

}

/**
 * Observation: Invoke this method only once
 */
private fun fixGoogleMapBugTemp() {
    val googleBug = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
    if (!googleBug.contains("fixed")) {
        val corruptedZoomTables = File(filesDir, "ZoomTables.data");
        corruptedZoomTables.delete();
        googleBug.edit().putBoolean("fixed", true).apply();
    }
}

Obejście : Wyczyść dane aplikacji (nie tylko pamięć podręczną).

Uwaga : kopia problematycznego pliku z pakietów aplikacji na urządzeniu, jeśli ktoś potrzebuje go do repro.

Blok

Źródło

GL


3

Pełna i oficjalna odpowiedź dla wszystkich:

Diagnoza: awaria przy ładowaniu mobilnych zestawów SDK platformy Google Maps (iOS i Android).

Obejście: * Wyczyść dane aplikacji, której dotyczy problem (nie tylko pamięć podręczną), lub odinstaluj, a następnie ponownie zainstaluj aplikację, której dotyczy problem.

  • Obejście kodu dla systemu iOS:

Zalecane umieszczenie kodu jest przed inicjalizacją GMSServices w aplikacji (_: didFinishLaunchingWithOptions :) (Swift) lub aplikacji: didFinishLaunchingWithOptions: (Objective-C). Konkretnie:

Szybki:

let key = "GoogleMapsServerControlledParamsKey_bug_154855417"
if !UserDefaults.standard.bool(forKey: key) {
    let urls = FileManager.default.urls(for: .applicationSupportDirectory, in: .userDomainMask)
    if urls.count > 0 {
        let paramUrl = urls[0].appendingPathComponent("com.google.GoogleMaps/ServerControlledParams", isDirectory: false)
        try? FileManager.default.removeItem(at: paramUrl)
    }
    UserDefaults.standard.set(true, forKey: key)
}

Cel C:

NSString *key = @"GoogleMapsServerControlledParamsKey_bug_154855417";
BOOL keyExists = [[NSUserDefaults standardUserDefaults] boolForKey:key];
if (!keyExists) {
    NSArray<NSURL *> *array =
        [[NSFileManager defaultManager] URLsForDirectory:NSApplicationSupportDirectory
                                               inDomains:NSUserDomainMask];
    if (array.count > 0) {
        NSURL *url =
            [array[0] URLByAppendingPathComponent:@"com.google.GoogleMaps/ServerControlledParams"
                                      isDirectory:NO];
        if (url) {
            [[NSFileManager defaultManager] removeItemAtURL:url error:NULL]);
        }
    }
    [[NSUserDefaults standardUserDefaults] setBool:YES forKey:key];
}

Po wdrożeniu go w aplikacji możesz złożyć zgłoszenie do pomocy technicznej Maps, jeśli chcesz, abyśmy przyspieszyli jego zatwierdzenie. Pamiętaj, aby podać identyfikator aplikacji, identyfikator pakietu oraz wersję, którą chcesz sprawdzić w swojej sprawie.

  • Obejście kodu dla Androida:

    Zalecane miejsce dla kodu znajduje się w Application.onCreate ():

    Jawa

    try {
      SharedPreferences hasFixedGoogleBug154855417 = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE);
      if (!hasFixedGoogleBug154855417.contains("fixed")) {
        File corruptedZoomTables = new File(getFilesDir(), "ZoomTables.data");
        File corruptedSavedClientParameters = new File(getFilesDir(), "SavedClientParameters.data.cs");
        File corruptedClientParametersData =
            new File(
              getFilesDir(),
              "DATA_ServerControlledParametersManager.data.v1."
                  + getBaseContext().getPackageName());
        corruptedZoomTables.delete();
        corruptedSavedClientParameters.delete();
        corruptedClientParametersData.delete();
        hasFixedGoogleBug154855417.edit().putBoolean("fixed", true).apply();
      }
    } catch (Exception e) {
    
    }

    Kotlin

    try {
        val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
        if (!sharedPreferences.contains("fixed")) {
            val corruptedZoomTables = File(filesDir, "ZoomTables.data")
            val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
            val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
            corruptedZoomTables.delete()
            corruptedSavedClientParameters.delete()
            corruptedClientParametersData.delete()
            sharedPreferences.edit().putBoolean("fixed", true).apply()
        }
    } catch (exception: Exception) {
    
    }

Źródło: https://issuetracker.google.com/issues/1548554


2

To działa kod dla Xamarin. Musisz zainstalować pakiet nuget Xamarin.Essentials.

if (!Preferences.Get("google_bug_fixed", false))
{
    var corruptedZoomTables = new File(FileSystem.AppDataDirectory, "ZoomTables.data");
    corruptedZoomTables.Delete();
    Preferences.Set("google_bug_fixed", true);
}

1
Czy ostatni wiersz nie powinien przeczytać Preferences.SET (.....
AndyM

1
Masz rację. Naprawiłem to.
Jan Nepraš

1

Aby uniknąć awarii, należy wywołać następującą metodę w aplikacji onCreate aplikacji na Androida.

private fun clearCorruptedGMapsPreference() {
        try {
            val sharedPreferences = getSharedPreferences("google_bug_154855417", Context.MODE_PRIVATE)
            if (!sharedPreferences.contains("fixed")) {
                val corruptedZoomTables = File(filesDir, "ZoomTables.data")
                val corruptedSavedClientParameters = File(filesDir, "SavedClientParameters.data.cs")
                val corruptedClientParametersData = File(filesDir, "DATA_ServerControlledParametersManager.data.${packageName}")
                val corruptedClientParametersDataV1 = File(filesDir, "DATA_ServerControlledParametersManager.data.v1.${packageName}")
                corruptedZoomTables.delete()
                corruptedSavedClientParameters.delete()
                corruptedClientParametersData.delete()
                corruptedClientParametersDataV1.delete()
                sharedPreferences.edit().putBoolean("fixed", true).apply()
            }
        } catch (exception: Exception) {
            LogUtil.e(this@CourierApplication::class.java.name, "An error has happened. Error: ".plus(exception.cause?.message
                    ?: ""))
        }
    }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.