AndroidRuntime: ECCEZIONE FATALE: androidmapsapi-ZoomTableManager


135

La mia app che utilizza Google Maps SDK (v2) ha appena iniziato a bloccarsi con questa eccezione:

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)

Nell'SDK beta v3, la traccia dello stack è:

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)

Qual è la causa?


10
Forse è un problema di Google Maps
Eduardo Herzer,

1
È un'app di produzione o solo un test?
user961186

18
Nota: non pubblicare le risposte "anch'io" a questa domanda. Solo le risposte che rispondono alla domanda devono essere pubblicate come risposte.
Wai Ha Lee,

3
gli aggiornamenti saranno qui: issuetracker.google.com/issues/154855417
lewkka

2
@MidnightGuest Se ci si espande un po ', potrebbe essere una buona domanda.
Makyen,

Risposte:


84

Modifica : la seguente è la soluzione ufficiale di Google ( link )

Sommario

App dell'arresto anomalo del thread dell'SDK di Google Maps (ArrayIndexOutOfBoundsException) - Soluzione offerta

Descrizione

Il 23 aprile 2020 a partire dalle 11:30 PDT , Google ha fornito per 4 ore un aggiornamento alla configurazione di un componente mobile di Maps, innescando arresti anomali negli SDK di Maps per Android e iOS. Le applicazioni sui dispositivi che hanno scaricato questa versione della configurazione (durante il periodo di interruzione) erano vulnerabili all'arresto anomalo. Soluzioni alternative sono disponibili per gli SDK di Maps per Android e iOS.

Maps SDK per Android

Maps SDK per Android v2 (incluso in Google Play Services)

Gli aggiornamenti a Google Play Services per correggere l'arresto anomalo sono stati pubblicati su tutti i dispositivi con Google Play Services versione 17.4.55 e successive. Non è stato modificato il numero di versione di Google Play Services sul dispositivo dopo l'installazione dell'aggiornamento. Non è richiesta alcuna azione da parte degli sviluppatori o degli utenti finali per ricevere il modulo Mappe aggiornato; tuttavia, gli sviluppatori possono verificare che il modulo sia presente su un determinato dispositivo con il seguente comando adb:

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

Dovresti vedere la riga Module Set ID: mapselencata nella Module Setssezione.

Module Set ID: maps, Module Set Version: 2015120015120000

I tassi di arresto anomalo di Maps SDK per Android v2 sono tornati alla normalità.

A partire da ora, se non hai aggiornato l'app con le soluzioni alternative per il codice lato client menzionate di seguito, non è necessario intraprendere ulteriori azioni.

Se hai già aggiornato l'app con le soluzioni alternative, puoi rimuovere la soluzione alternativa in un successivo aggiornamento dell'app (ma mantenere la soluzione alternativa è sicura).

Premium Plan Maps SDK per Android v2 o Maps SDK per Android v3 beta (librerie statiche)

Se la tua app utilizza Premium Plan Maps SDK per Android v2 o Maps SDK per Android v3 beta (librerie statiche) e si verificano ancora arresti anomali, ti consigliamo vivamente di implementare le soluzioni alternative di seguito tramite un aggiornamento della tua app. Poiché l'applicazione sta caricando una versione statica dell'SDK che è vulnerabile ai dati errati archiviati su alcuni dispositivi, solo un aggiornamento dell'applicazione può risolvere il problema.

Approvazioni per la recensione di Play Store

Se aggiorni la tua app ma riscontri ritardi nell'approvazione delle recensioni del Play Store, invia una richiesta di supporto con l'ID del pacchetto della tua app: ⁠ Contatta il team di supporto . Il nostro team di supporto intensificherà internamente la tua richiesta e accelererà l'approvazione.

Recensioni negative nel Google Play Store

Alcuni sviluppatori di applicazioni hanno chiesto informazioni sulle recensioni da 1 stella nel Google Play Store lasciate dagli utenti finali a causa di arresti anomali. Solo i commenti che violano le norme di Google Play [1] possono essere rimossi. Puoi anche contrassegnare recensioni offensive in Play Console [2]. Le applicazioni non verranno rimosse automaticamente dal Google Play Store a causa di recensioni negative. Vale anche la pena notare che il calcolo della valutazione complessiva della recensione dell'app favorisce le recensioni recenti, il che significa che la valutazione tornerà ai livelli pre-incidente nel tempo.

[1] ⁠ Classifiche e recensioni sul Play Store

[2] ⁠ Segnala recensioni inappropriate

Maps SDK per iOS

I tassi di crash su iOS sono tornati alla normalità. Se l'applicazione presenta ancora arresti anomali, è necessario aggiornare e pubblicare l'app con le soluzioni alternative del codice comunicate qui.

Per domande sulla distribuzione o la spedizione dell'applicazione nell'App Store di Apple, contatta direttamente Apple.


Con questo aggiornamento, stiamo chiudendo questo problema. Grazie a tutti per la pazienza. Il nostro team sta effettuando un'indagine interna approfondita di questo incidente; appena possibile pubblicheremo la nostra analisi (tra circa una settimana). Nel frattempo, se hai domande o hai ancora problemi, ti preghiamo di presentare una richiesta di supporto .

soluzioni alternative:

  • Gli utenti finali su Android possono cancellare i dati dell'app interessata (non solo la cache).

  • Gli utenti finali su iOS possono disinstallare e reinstallare le app interessate.

  • Gli sviluppatori di app possono applicare le soluzioni alternative di codice riportate di seguito al fine di risolvere il problema per tutti i loro utenti finali.

Soluzione alternativa del codice per iOS:

Il posizionamento consigliato per il codice è prima dell'inizializzazione di GMSServices nell'applicazione (_: didFinishLaunchingWithOptions :) (Swift) o nell'applicazione: didFinishLaunchingWithOptions: (Objective-C) metodo. In particolare:

Swift:

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

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

Soluzione alternativa del codice per Android:

Il posizionamento consigliato per il codice è in Application.onCreate ():

Giava

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

}

Le soluzioni alternative fornite qui coprono tutti i gusti e le versioni disponibili dei nostri SDK per Android. Per chiarire ulteriormente (nel caso in cui sia stata rilasciata una versione precedente della soluzione alternativa che non ha eliminato tanti file):

  • Le applicazioni che utilizzano Maps Android SDK v2 devono eliminare solo un file: ZoomTables.data.
  • Le applicazioni che utilizzano Maps Android SDK v3 beta devono anche eliminare solo un file

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

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


1
La nostra app funziona sull'emulatore, stesso codice, ma non su un dispositivo di produzione. Ha iniziato a verificarsi durante lo zoom. ECCEZIONE FATALE: androidmapsapi-ZoomTableManager
user961186

1
L'errore è su Android.
user961186

2
Ho appena verificato il crash di molte app che utilizzano Map, tra cui Uber, Lyft, ecc. Google Maps sembra funzionare per me, deve puntare a un altro endpoint API diverso dall'API pubblica.
AlexVPerl,

16
Il vero crimine qui è che anche quando la chiamata sulle mappe è incapsulata in un'istruzione try / catch, in qualche modo Google Maps sostituisce la tua chiamata di prova e blocca l'app invece di lanciare un errore. Le mappe dovrebbero generare un'eccezione adeguata quando non sono disponibili, non solo bloccare tutto.
Brettins,

2
stesso problema in Pakistan
Syed Raza Mehdi,

44

Sembra che in ogni app Google Map crei il file ZoomTables.data.

inserisci qui la descrizione dell'immagine

Questo file era non valido, versione non valida che poteva essere scaricata da un commento . Per riprodurre il problema, rimuovere ZoomTables.data dai pacchetti dell'app sul dispositivo e inserire uno non valido. L'app dovrebbe bloccarsi.

Attualmente, il problema è stato risolto da parte di Google, ma le app contengono ancora una versione cache di quel file di dati. Per risolvere il problema dovremmo rimuovere quel file direttamente sull'app in avvio nel metodo 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) {

  }
}

Aggiornamento 1

Ho aggiornato la soluzione, basandomi sul commento più recente degli sviluppatori di Google :

Le soluzioni alternative fornite qui coprono tutti i gusti e le versioni disponibili dei nostri SDK per Android. Per chiarire ulteriormente (nel caso in cui sia stata rilasciata una versione precedente della soluzione alternativa che non ha eliminato tanti file):

Le applicazioni che utilizzano Maps Android SDK v2 devono eliminare solo un file: ZoomTables.data. Le applicazioni che utilizzano Maps Android SDK v3 beta devono eliminare solo un file, DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) o DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())


2
Escludendo il file ZoomTables.data ha funzionato per me. Molte grazie! Tutti dovrebbero usarlo e contrassegnarlo come risposta!
Eduardo Herzer,

@ArthurAttout Sì, preferisco farlo per ora e riparare le mie app di produzione che sono state bloccate per più di 16 ore piuttosto che aspettare più tempo per la correzione di Google
Eduardo Herzer

@EduardoHerzer L'ETA di Google è di 48 ore e la produzione completa richiederà più di 48 ore. (Aggiornamento tempo di revisione + tempo di lancio)
Muhammad Saqib

Questo ha funzionato per me! Ho cambiato solo un po 'per la mia app Flutter: var dir = await getApplicationSupportDirectory (); File danneggiatoZoomTables = nuovo file (dir.path + "/ZoomTables.data");
csk

Perché rimuoviamo ZoomTables.data solo una volta? Che cosa succede se questo verrà nuovamente danneggiato in futuro?
Jan Nepraš,

11

Questa soluzione ha funzionato per me

  1. Prima apri "Informazioni app"
  2. Scegli "Archiviazione"
  3. Fai clic su "Cancella dati"
  4. Apri di nuovo l'app e verifica se il problema è stato risolto.

    Di seguito sono riportati suggerimenti solo per aiutare i tuoi clienti.

  5. Invia un'e-mail a tutti gli utenti per l'inconveniente e descrivi loro il problema che hanno affrontato e fornisci loro i passaggi sopra indicati per risolvere il problema.

  6. Puoi anche inviare notifiche push a tutti i tuoi utenti con le notifiche push di Firebase, se la tua app ha il servizio di notifiche push.

Dimostrazione di schermate:

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine

inserisci qui la descrizione dell'immagine


6

Per Android, più sviluppatori hanno menzionato una soluzione alternativa che consiste nell'eliminazione del file ZoomTable.data direttamente dalla loro applicazione. Dopo la revisione, questa correzione sembra sicura e potresti provarla nella tua applicazione.

Fare riferimento a https://issuetracker.google.com/154855417#comment179

Se desideri che i tuoi utenti continuino a utilizzare l'app senza reinstallare, il codice di esempio viene incollato qui per comodità. In 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();
}

riferimento: l' SDK di Google Maps si arresta in modo anomalo - parzialmente risolto



6

Svantaggi delle soluzioni sopra:

  • ZoomTables.data viene eliminato su ogni dispositivo, indipendentemente dal fatto che il dispositivo sia interessato o meno dall'incidente
  • La soluzione alternativa funziona una sola volta, è sicuro che questo problema non si ripeta più?

Svantaggi della mia soluzione:

  • alla prima esecuzione dell'attività delle mappe sulla mappa del dispositivo interessato è vuota. Dopo la rotazione del dispositivo o la seconda mappa di esecuzione viene visualizzata

La mia soluzione rileva l'eccezione generata dall'SDK di Maps, chiamala in onCreate della 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);
    });
}

Ho appena eliminato una soluzione simile. Dato che ho fonti di mappatura alternative a Google nella mia app, cambio la fonte predefinita in modo che non sia Google, dando all'utente un messaggio che spiega cosa è stato fatto. Spero che mi terrà al sicuro se Google riuscirà a fare qualcosa di simile in futuro. Mi aspetto comunque che i test migliorino.
Ifor

Ho dovuto svuotare la memoria per risolvere questo problema. Per qualsiasi motivo, eliminare ZoomTables.data non è stato sufficiente per risolverlo. Ho fatto l'eliminazione nella mia attività di avvio onCreate (). Immagino che dovrei esaminare il gestore delle eccezioni dell'ambito dell'applicazione.
ShellDude,

3

Riteniamo che la causa principale degli arresti di SDK di Google Maps sia stata corretta. La correzione viene propagata alle applicazioni interessate e continua verso la risoluzione al ritmo previsto. La risoluzione completa dovrebbe essere completata entro giovedì 2020-04-23 19:45 US / Pacifico.

La versione produttiva è stata risolta (da parte di google) ma se hai ancora problemi con l'emulatore devi eseguire il seguente codice solo una volta.

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

Soluzione alternativa : cancellare i dati dell'applicazione (non solo la cache).

Nota : una copia del file problematico dai pacchetti dell'app sul dispositivo se qualcuno ne ha bisogno per la riproduzione.

Bloccare

fonte

GL


3

Risposta completa e ufficiale per tutti:

Diagnosi: crash degli SDK per dispositivi mobili della piattaforma Google Maps (iOS e Android) al caricamento.

Soluzione alternativa: * Cancella i dati dell'app interessata (non solo la cache) o disinstalla quindi reinstalla le app interessate.

  • Soluzione alternativa del codice per iOS:

Il posizionamento consigliato per il codice è prima dell'inizializzazione di GMSServices nell'applicazione (_: didFinishLaunchingWithOptions :) (Swift) o nell'applicazione: didFinishLaunchingWithOptions: (Objective-C) metodo. In particolare:

Swift:

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

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

Dopo averlo distribuito nella tua app, puoi presentare una richiesta di supporto di Maps se desideri che aiutiamo ad accelerare la sua approvazione. Assicurati di includere l'ID dell'applicazione, l'ID pacchetto e la versione che desideri rivedere nel tuo caso.

  • Soluzione alternativa del codice per Android:

    Il posizionamento consigliato per il codice è in Application.onCreate ():

    Giava

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

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


2

Questo è un codice funzionante per Xamarin. Devi installare il pacchetto 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
L'ultima riga non dovrebbe leggere Preferences.SET (.....
AndyM,

1
Hai ragione. L'ho riparato.
Jan Nepraš,

1

Dovresti chiamare il metodo seguente su onCreate della tua app Android per evitare l'arresto anomalo.

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
                    ?: ""))
        }
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.