AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ZoomTableManager


135

Mon application qui utilise le SDK Google Maps (v2) vient de commencer à planter avec cette exception:

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)

Dans le SDK v3 beta, la trace de la pile est:

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)

Quelle est la cause?


10
C'est peut-être un problème avec Google Maps
Eduardo Herzer

1
S'agit-il d'une application de production ou simplement d'un test?
user961186

18
Remarque: Ne postez pas de réponses "moi aussi" à cette question. Seules les réponses qui répondent à la question doivent être publiées comme réponses.
Wai Ha Lee

3
les mises à jour seront ici: issuetracker.google.com/issues/154855417
lewkka

2
@MidnightGuest Si vous développez un peu cela, cela pourrait poser une bonne question.
Makyen

Réponses:


84

Modifier : voici la solution officielle de Google ( lien )

Sommaire

Le thread du SDK Google Maps bloque l'application (ArrayIndexOutOfBoundsException) - Solution proposée

La description

Le 23 avril 2020 à partir de 11h30 PDT , Google a servi pendant 4 heures une mise à jour de la configuration d'un composant mobile Maps, déclenchant des plantages dans les SDK Maps pour Android et iOS. Les applications sur les appareils qui ont téléchargé cette version de la configuration (pendant la période d'indisponibilité) étaient vulnérables au crash. Des solutions de contournement sont proposées pour les SDK Maps pour Android et iOS.

SDK Maps pour Android

SDK Maps pour Android v2 (inclus dans les services Google Play)

Les mises à jour des services Google Play pour corriger le plantage ont été publiées sur tous les appareils équipés des services Google Play version 17.4.55 et plus récente. Aucun changement n'a été apporté au numéro de version des services Google Play sur l'appareil après l'installation de la mise à jour. Aucune action n'est requise de la part des développeurs ou des utilisateurs finaux pour recevoir le module Maps mis à jour; cependant, les développeurs peuvent vérifier que le module est présent sur un appareil donné avec la commande adb suivante:

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

Vous devriez voir la ligne Module Set ID: mapsrépertoriée dans la Module Setssection.

Module Set ID: maps, Module Set Version: 2015120015120000

Les taux de plantage de Maps SDK pour Android v2 sont de retour à la normale.

Pour l'instant, si vous n'avez pas mis à jour votre application avec les solutions de contournement de code côté client mentionnées ci-dessous, vous n'avez pas besoin de prendre d'autres mesures.

Si vous avez déjà mis à jour votre application avec les solutions de contournement, vous pouvez supprimer la solution de contournement dans une mise à jour ultérieure de votre application (mais conserver la solution de contournement est sûr).

Premium Plan Maps SDK pour Android v2 ou Maps SDK pour Android v3 beta (bibliothèques statiques)

Si votre application utilise le SDK Premium Plan Maps pour Android v2 ou Maps SDK pour Android v3 bêta (bibliothèques statiques) et continue de subir des plantages, nous vous recommandons vivement de déployer les solutions de contournement ci-dessous via une mise à jour de votre application. Comme votre application charge une version statique du SDK, vulnérable aux mauvaises données stockées sur certains appareils, seule une mise à jour de votre application peut résoudre le problème.

Approbations des avis sur Play Store

Si vous mettez à jour votre application mais que vous rencontrez des retards d'approbation des avis sur le Play Store, veuillez déposer un dossier d'assistance avec l'ID de package de votre application: ⁠ Contactez l'équipe d'assistance . Notre équipe de support transmettra en interne votre demande et accélérera l'approbation.

Avis négatifs dans le Google Play Store

Certains développeurs d'applications se sont renseignés sur les avis 1 étoile dans le Google Play Store laissés par les utilisateurs finaux en raison de plantages. Seuls les commentaires enfreignant la politique de Google Play [1] peuvent être supprimés. Vous pouvez également signaler les avis abusifs dans la Play Console [2]. Les applications ne seront pas automatiquement supprimées du Google Play Store en raison d'avis négatifs. Il convient également de noter que le calcul de la note globale de votre avis sur l'application favorise les avis récents, ce qui signifie que votre note retrouvera son niveau d'avant l'incident au fil du temps.

[1] ⁠ Notes et avis sur le Play Store

[2] ⁠ Signaler des avis inappropriés

SDK Maps pour iOS

Les taux de crash sur iOS sont revenus à la normale. Si votre application connaît toujours des plantages, vous devez mettre à jour et publier votre application avec les solutions de contournement de code communiquées ici.

Pour toute question sur le déploiement ou l'accélération de votre application dans l'App Store d'Apple, veuillez contacter Apple directement.


Avec cette mise à jour, nous fermons ce problème. Merci à tous pour votre patience. Notre équipe effectue une enquête interne approfondie sur cet incident; dès que possible, nous publierons notre analyse (dans environ une semaine). En attendant, si vous avez des questions ou rencontrez toujours des problèmes, veuillez ⁠ déposer un dossier d'assistance .

Solutions de contournement:

  • Les utilisateurs finaux sur Android peuvent effacer les données de l'application affectée (pas seulement le cache).

  • Les utilisateurs finaux sur iOS peuvent désinstaller puis réinstaller les applications concernées.

  • Les développeurs d'applications peuvent appliquer les solutions de contournement de code ci-dessous afin de résoudre le problème pour tous leurs utilisateurs finaux.

Solution de code pour iOS:

L'emplacement recommandé pour le code est avant l'initialisation de GMSServices dans la méthode application (_: didFinishLaunchingWithOptions :) (Swift) ou application: didFinishLaunchingWithOptions: (Objective-C). Plus précisément:

Rapide:

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

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

Solution de code pour Android:

L'emplacement recommandé pour le code est dans Application.onCreate ():

Java

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) {

}

Les solutions de contournement fournies ici couvrent toutes les versions et versions disponibles de nos SDK pour Android. Pour clarifier davantage (au cas où vous auriez publié une version antérieure de la solution de contournement qui ne supprimait pas autant de fichiers):

  • Les applications qui utilisent Maps Android SDK v2 ne doivent supprimer qu'un seul fichier: ZoomTables.data.
  • Les applications qui utilisent Maps Android SDK v3 beta ne doivent supprimer qu'un seul fichier, soit

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

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


1
Notre application fonctionne sur l'émulateur, même code, mais pas sur un appareil de production. Cela a commencé à se produire lors du zoom. EXCEPTION FATALE: androidmapsapi-ZoomTableManager
user961186

1
L'erreur est sur Android.
user961186

2
Je viens de vérifier que de nombreuses applications utilisant Map se bloquent, y compris Uber, Lyft, etc. Google Maps semble fonctionner pour moi, il doit pointer vers un autre point de terminaison d'API différent de l'API publique.
AlexVPerl

16
Le vrai crime ici est que même lorsque l'appel de cartes est encapsulé dans une déclaration try / catch, Google Maps remplace votre appel d'essai et plante l'application au lieu de générer une erreur. Les cartes devraient lever une exception appropriée lorsqu'elles ne sont pas disponibles, pas simplement planter tout.
Brettins

2
même problème au Pakistan
Syed Raza Mehdi

44

Il semble que dans chaque application, Google Map crée un fichier ZoomTables.data.

entrez la description de l'image ici

Ce fichier était mal formé, une version malformée qui pouvait être téléchargée à partir du commentaire . Pour reproduire le problème, supprimez ZoomTables.data des packages d'application sur l'appareil et insérez-en un mal formé. L'application devrait se bloquer.

Actuellement, le problème a été résolu du côté de Google, mais les applications contiennent toujours une version en cache de ce fichier de données. Pour résoudre le problème, nous devons supprimer ce fichier dès le démarrage de l'application dans la méthode Application onCreate.

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) {

  }
}

Mise à jour 1

J'ai mis à jour la solution de contournement, sur la base des derniers commentaires des développeurs Google :

Les solutions de contournement fournies ici couvrent toutes les versions et versions disponibles de nos SDK pour Android. Pour clarifier davantage (au cas où vous auriez publié une version antérieure de la solution de contournement qui ne supprimait pas autant de fichiers):

Les applications qui utilisent Maps Android SDK v2 ne doivent supprimer qu'un seul fichier: ZoomTables.data. Les applications qui utilisent Maps Android SDK v3 beta ne doivent supprimer qu'un seul fichier, DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) ou DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())


2
Exclure le fichier ZoomTables.data a fonctionné pour moi. Merci beaucoup! Tout le monde devrait l'utiliser et marquer comme réponse!
Eduardo Herzer le

@ArthurAttout Oui, je préfère le faire pour l'instant et réparer mes applications de production qui sont bloquées plus de 16 heures que d'attendre plus de temps pour le correctif de Google
Eduardo Herzer

L'ETA de @EduardoHerzer Google est de 48 heures et le déploiement complet de la production prendra plus de 48 heures. (Mettre à jour le temps de révision + le temps de déploiement)
Muhammad Saqib

Cela a fonctionné pour moi! J'ai seulement changé un peu pour mon application Flutter: var dir = wait getApplicationSupportDirectory (); Fichier corrompuZoomTables = nouveau fichier (dir.path + "/ZoomTables.data");
csk

Pourquoi supprimons-nous une seule fois ZoomTables.data? Et si cela se corrompait à l'avenir?
Jan Nepraš

11

Cette solution a fonctionné pour moi

  1. Ouvrez d'abord "App Info"
  2. Choisissez "Stockage"
  3. Cliquez sur "Effacer les données"
  4. Ouvrez à nouveau l'application et vérifiez si le problème est résolu.

    Vous trouverez ci-dessous des suggestions uniquement pour aider vos clients.

  5. Envoyez un e-mail à tous vos utilisateurs pour les désagréments et décrivez-leur le problème qu'ils ont rencontré et donnez-leur les étapes mentionnées ci-dessus pour résoudre leur problème.

  6. Vous pouvez également envoyer une notification push à tous vos utilisateurs avec les notifications push Firebase, si votre application dispose du service de notifications push.

Démonstration de captures d'écran:

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici


6

Pour Android, plusieurs développeurs ont mentionné une solution de contournement consistant à supprimer le fichier ZoomTable.data directement de leur application. Après examen, ce correctif semble sûr et vous pouvez l'essayer dans votre application.

Veuillez vous référer à https://issuetracker.google.com/154855417#comment179

Si vous souhaitez que vos utilisateurs continuent à utiliser votre application sans réinstaller, l'exemple de code est copié-collé ici pour votre commodité. Dans 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();
}

référence: Google Maps SDK plante - partiellement résolu



6

Inconvénients des solutions ci-dessus:

  • ZoomTables.data est supprimé sur tous les appareils, que l'appareil soit affecté ou non par le crash
  • Cette solution de contournement ne fonctionne qu'une seule fois, est-il sûr que ce problème ne se reproduira plus?

Inconvénients de ma solution:

  • lors de la première exécution de l'activité des cartes sur la carte de l'appareil affecté est vide. Après la rotation de l'appareil ou la deuxième carte d'exécution s'affiche

Ma solution intercepte l'exception levée par le SDK Maps, appelez ceci dans onCreate de la classe 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);
    });
}

Je viens de proposer une solution de contournement similaire. Comme j'ai des sources de mappage alternatives à Google dans mon application, je modifie la source par défaut pour ne pas être aussi Google en donnant à l'utilisateur un message expliquant ce qui a été fait. J'espère que cela me gardera en sécurité si Google parvient à faire quelque chose de similaire à l'avenir. Je m'attends cependant à ce que les tests s'améliorent.
Ifor

J'ai dû vider l'espace de stockage pour résoudre ce problème. Pour une raison quelconque, la suppression de ZoomTables.data n'était pas suffisante pour résoudre ce problème pour moi. J'ai fait la suppression dans mon activité de démarrage surCreate (). Je suppose que je devrais examiner le gestionnaire d'exceptions de la portée de l'application.
ShellDude

3

Nous pensons que la cause première des plantages du SDK Google Maps a été corrigée. Le correctif est propagé aux applications concernées et se poursuit vers la résolution au rythme attendu. La résolution complète devrait s'achever le jeudi 20 avril 2020 à 19 h 45 aux États-Unis / Pacifique.

La version productive a été corrigée (du côté de Google) mais si vous avez toujours des problèmes avec votre émulateur, vous ne devez exécuter le code suivant qu'une seule fois.

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

Solution : effacez les données d'application (pas seulement le cache).

Remarque : Une copie du fichier problématique des packages d'application sur l'appareil si quelqu'un en a besoin pour une reproduction.

Bloquer

La source

GL


3

Réponse complète et officielle pour tous:

Diagnostic: crash des SDK mobiles de la plate-forme Google Maps (iOS et Android) en charge.

Solution: * Effacez les données de l'application concernée (pas seulement le cache), ou désinstallez puis réinstallez la ou les applications concernées.

  • Solution de code pour iOS:

L'emplacement recommandé pour le code est avant l'initialisation de GMSServices dans la méthode application (_: didFinishLaunchingWithOptions :) (Swift) ou application: didFinishLaunchingWithOptions: (Objective-C). Plus précisément:

Rapide:

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

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

Une fois que vous l'avez déployé dans votre application, vous pouvez déposer un dossier d'assistance Maps si vous souhaitez que nous accélérions son approbation. Veuillez vous assurer d'inclure l'ID de votre application, l'ID de l'ensemble et la version que vous souhaitez consulter dans votre cas.

  • Solution de code pour Android:

    L'emplacement recommandé pour le code est dans Application.onCreate ():

    Java

    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) {
    
    }

Source: https://issuetracker.google.com/issues/1548554


2

Il s'agit du code de travail pour Xamarin. Vous devez installer le package de 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
La dernière ligne ne devrait-elle pas lire Preferences.SET (.....
AndyM

1
Vous avez raison. Je l'ai corrigé.
Jan Nepraš

1

Vous devez appeler la méthode suivante sur le onCreate de votre application Android pour éviter le plantage.

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
                    ?: ""))
        }
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.