AndroidRuntime: EXCEPCIÓN FATAL: androidmapsapi-ZoomTableManager

135

Mi aplicación que usa el SDK de Google Maps (v2) acaba de comenzar a fallar con esta excepción:

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@[email protected] (120400-0):9)
        at com.google.maps.api.android.lib6.gmm6.vector.cv.a(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (120400-0):23)
        at com.google.maps.api.android.lib6.gmm6.util.m.run(:com.google.android.gms.dynamite_mapsdynamite@[email protected] (120400-0):14)
        at java.lang.Thread.run(Thread.java:919)

En el v3 beta SDK, el seguimiento de la pila es:

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)

¿Cual es la causa?

Prem Chand
fuente
10
Tal vez sea un problema de Google Maps
Eduardo Herzer
1
¿Es esta una aplicación de producción o solo una prueba?
user961186
18
Nota: No publique respuestas "yo también" a esta pregunta. Solo las respuestas que respondan a la pregunta deben publicarse como respuestas.
Wai Ha Lee
3
las actualizaciones estarán aquí: issuetracker.google.com/issues/154855417
lewkka
2
@MidnightGuest Si lo expandes un poco, podría ser una buena pregunta.
Makyen

Respuestas:

84

Editar : la siguiente es la solución oficial de Google ( enlace )

Resumen

El hilo del SDK de Google Maps bloquea la aplicación (ArrayIndexOutOfBoundsException) - Solución ofrecida

Descripción

El 23 de abril de 2020 a partir de las 11:30 PDT , Google realizó durante 4 horas una actualización de la configuración de un componente móvil de Maps, lo que provocó bloqueos en los SDK de Maps para Android e iOS. Las aplicaciones en dispositivos que descargaron esta versión de la configuración (durante el período de interrupción) fueron vulnerables al bloqueo. Se ofrecen soluciones alternativas para los SDK de Maps para Android e iOS.

Maps SDK para Android

Maps SDK para Android v2 (incluido en Google Play Services)

Las actualizaciones de Google Play Services para solucionar el bloqueo se han publicado en todos los dispositivos con Google Play Services versión 17.4.55 y posteriores. No hay cambios en el número de versión de los Servicios de Google Play en el dispositivo después de instalar la actualización. No se requiere ninguna acción de los desarrolladores o usuarios finales para recibir el módulo Maps actualizado; sin embargo, los desarrolladores pueden verificar que el módulo esté presente en un dispositivo determinado con el siguiente comando adb:

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

Debería ver la línea que Module Set ID: mapsfigura en la Module Setssección.

Module Set ID: maps, Module Set Version: 2015120015120000

Las tasas de bloqueo de Maps SDK para Android v2 han vuelto a la normalidad.

A partir de ahora, si no ha actualizado su aplicación con las soluciones alternativas de código del lado del cliente que se mencionan a continuación, no necesita tomar más medidas.

Si ya ha actualizado su aplicación con las soluciones, puede eliminar la solución en una actualización posterior de su aplicación (pero mantener la solución es segura).

Premium Plan Maps SDK para Android v2 o Maps SDK para Android v3 beta (bibliotecas estáticas)

Si su aplicación utiliza el SDK de Mapas de Plan Premium para Android v2 o SDK de Maps para Android v3 beta (bibliotecas estáticas), y aún experimenta fallas, le recomendamos encarecidamente que implemente las soluciones a continuación a través de una actualización de su aplicación. Como su aplicación está cargando una versión estática del SDK que es vulnerable a los datos incorrectos que se almacenan en algunos dispositivos, solo una actualización de su aplicación puede resolver el problema.

Aprobaciones de reseñas de Play Store

Si actualiza su aplicación pero experimenta retrasos en las aprobaciones de las revisiones de Play Store, presente un caso de asistencia con el ID del paquete de su aplicación: ⁠ Póngase en contacto con el equipo de asistencia . Nuestro equipo de soporte escalará internamente su solicitud y acelerará la aprobación.

Opiniones negativas en Google Play Store

Algunos desarrolladores de aplicaciones preguntaron sobre las reseñas de 1 estrella en Google Play Store que dejaron los usuarios finales debido a bloqueos. Solo se pueden eliminar los comentarios que violen la política de Google Play [1]. También puedes marcar reseñas abusivas en Play Console [2]. Las aplicaciones no se eliminarán automáticamente de la tienda Google Play debido a las críticas negativas. También vale la pena señalar que el cálculo de su calificación general de revisión de aplicaciones favorece las revisiones recientes, lo que significa que su calificación se recuperará a niveles previos al incidente con el tiempo.

[1] ⁠ Calificaciones y reseñas en Play Store

[2] ⁠ Informar de críticas inapropiadas

Maps SDK para iOS

Las tasas de bloqueo en iOS vuelven a la normalidad. Si su aplicación aún experimenta fallas, debe actualizar y publicar su aplicación con las soluciones de código que se comunican aquí.

Si tiene preguntas sobre cómo implementar o acelerar su aplicación en la tienda de aplicaciones de Apple, comuníquese directamente con Apple.


Con esta actualización, estamos cerrando este problema. Gracias a todos por su paciencia. Nuestro equipo está realizando una investigación interna en profundidad de este incidente; tan pronto como sea posible, publicaremos nuestro análisis (en aproximadamente una semana). Mientras tanto, si tiene alguna pregunta o todavía tiene problemas, presente un caso de asistencia .

Soluciones alternativas:

  • Los usuarios finales en Android pueden borrar los datos de la aplicación afectada (no solo el caché).

  • Los usuarios finales en iOS pueden desinstalar y luego reinstalar las aplicaciones afectadas.

  • Los desarrolladores de aplicaciones pueden aplicar las soluciones alternativas de código a continuación para resolver el problema para todos sus usuarios finales.

Solución alternativa de código para iOS:

La ubicación recomendada para el código es antes de la inicialización de GMSServices en la aplicación (_: didFinishLaunchingWithOptions :) (Swift) o aplicación: didFinishLaunchingWithOptions: (Objective-C). Específicamente:

Rápido:

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

C objetivo:

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

Solución alternativa de código para Android:

La ubicación recomendada para el código está en 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) {

}

La solución provista aquí cubre todos los sabores y versiones disponibles de nuestros SDK para Android. Para aclarar más (en caso de que haya lanzado una versión anterior de la solución alternativa que no eliminó tantos archivos):

  • Las aplicaciones que usan Maps Android SDK v2 solo deberían eliminar un archivo: ZoomTables.data.
  • Las aplicaciones que usan Maps Android SDK v3 beta solo deberían eliminar un archivo, ya sea

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

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

jon
fuente
1
Nuestra aplicación funciona en el emulador, el mismo código, pero no en un dispositivo de producción. Comenzó a suceder al hacer zoom. EXCEPCIÓN FATAL: androidmapsapi-ZoomTableManager
user961186
1
El error está en Android.
user961186
2
Acabo de comprobar que muchas aplicaciones que usan Map están fallando, incluidas Uber, Lyft, etc. Google Maps parece funcionar para mí, debe estar apuntando a otro punto final de la API diferente de la API pública.
AlexVPerl
16
El verdadero crimen aquí es que incluso cuando la llamada de mapas está encapsulada en una declaración try / catch, de alguna manera Google Maps reemplaza su llamada try y bloquea la aplicación en lugar de arrojar un error. Los mapas deberían lanzar una excepción adecuada cuando no está disponible, no solo bloquear todo.
Brettins
2
mismo problema en Pakistán
Syed Raza Mehdi
44

Parece que en cada aplicación Google Map crea el archivo ZoomTables.data.

ingrese la descripción de la imagen aquí

Este archivo tenía una versión con formato incorrecto, con formato incorrecto que podía descargarse de los comentarios . Para reproducir el problema, elimine ZoomTables.data de los paquetes de la aplicación en el dispositivo e inserte uno con formato incorrecto. La aplicación debería bloquearse.

Actualmente, el problema se resolvió por parte de Google, pero las aplicaciones aún contienen una versión en caché de ese archivo de datos. Para solucionar el problema, debemos eliminar ese archivo directamente en el inicio de la aplicación en el Método de creación de aplicaciones.

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

  }
}

Actualización 1

He actualizado la solución, basándome en el último comentario de los desarrolladores de Google :

La solución provista aquí cubre todos los sabores y versiones disponibles de nuestros SDK para Android. Para aclarar más (en caso de que haya lanzado una versión anterior de la solución alternativa que no eliminó tantos archivos):

Las aplicaciones que usan Maps Android SDK v2 solo deberían eliminar un archivo: ZoomTables.data. Las aplicaciones que usan Maps Android SDK v3 beta solo deberían eliminar un archivo, ya sea DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) o DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())

Andrey T
fuente
2
Excluir el archivo ZoomTables.data funcionó para mí. ¡Muchas gracias! ¡Todos deberían usar esto y marcar como respuesta!
Eduardo Herzer
@ArthurAttout Sí, prefiero hacer esto por ahora y arreglar mis aplicaciones de producción que tienen más de 16 horas bloqueadas que esperar más tiempo para la solución de Google
Eduardo Herzer
@EduardoHerzer La ETA de Google es de 48 horas y el despliegue completo de la producción llevará más de 48 horas. (Actualización del tiempo de revisión + tiempo de implementación)
Muhammad Saqib
¡Esto funcionó para mí! Solo cambié un poco para mi aplicación Flutter: var dir = await getApplicationSupportDirectory (); Archivo corruptedZoomTables = nuevo archivo (dir.path + "/ZoomTables.data");
csk
¿Por qué eliminamos ZoomTables.data solo una vez? ¿Qué pasa si esto se corrompe en el futuro nuevamente?
Jan Nepraš
11

Esta solución me funcionó

  1. Primero abra "Información de la aplicación"
  2. Elija "Almacenamiento"
  3. Haga clic en "Borrar datos"
  4. Abra la aplicación nuevamente y verifique si se solucionó el problema.

    A continuación hay sugerencias solo para ayudar a sus clientes.

  5. Envíe un correo electrónico a todos sus usuarios por las molestias y describa el problema que enfrentaron y bríndeles los pasos mencionados anteriormente para resolver su problema.

  6. También puede enviar notificaciones push a todos sus usuarios con notificaciones push de Firebase, si su aplicación tiene el servicio de notificaciones push.

Demostración de capturas de pantalla:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Muhammed Irfan
fuente
6

Para Android, varios desarrolladores mencionaron una solución alternativa que consiste en eliminar el archivo ZoomTable.data directamente de su aplicación. Después de la revisión, esta solución parece segura, y puede probarla en su aplicación.

Consulte https://issuetracker.google.com/154855417#comment179

Si desea que sus usuarios continúen usando su aplicación sin volver a instalarla, el código de muestra se copia aquí para su comodidad. En 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();
}

referencia: el SDK de Google Maps se bloquea - parcialmente resuelto

Mahmoud Zaher
fuente
6

Inconvenientes de las soluciones anteriores:

  • ZoomTables.data se elimina en todos los dispositivos, independientemente de si el dispositivo se ve afectado por el bloqueo o no
  • La solución solo funciona una vez, ¿es seguro que este problema nunca volverá a ocurrir?

Inconvenientes de mi solución:

  • en la primera ejecución de mapas, la actividad en el mapa del dispositivo afectado está vacía. Después de la rotación del dispositivo o se muestra el segundo mapa de ejecución

Mi solución detecta la excepción lanzada por el SDK de Maps, llame a esto en onCreate de la clase de aplicación:

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);
    });
}
Werner Harnisch
fuente
Acabo de sacar una solución similar. Como tengo fuentes de mapeo alternativas a Google en mi aplicación, cambio la fuente predeterminada para que no sea Google y también le doy al usuario un mensaje explicando lo que se ha hecho. Espero que me mantenga a salvo si Google logra hacer algo similar en el futuro. Sin embargo, espero que las pruebas mejoren.
ifor
Tuve que borrar el almacenamiento para resolver este problema. Por alguna razón, eliminar ZoomTables.data no fue suficiente para resolver esto por mí. Hice la eliminación en mi actividad de inicio onCreate (). Supongo que debería analizar el controlador de excepciones de alcance de la aplicación.
ShellDude
3

Creemos que se ha solucionado la causa raíz de los bloqueos del SDK de Google Maps. La solución se propaga a las aplicaciones afectadas y continúa hacia la resolución al ritmo esperado. Se espera que la resolución completa se complete para el jueves, 2020-04-23 19:45 EE. UU. / Pacífico.

La versión productiva fue corregida (por parte de Google), pero si todavía tiene problemas con su emulador, debe ejecutar el siguiente código solo una vez.

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

Solución alternativa : borre los datos de la aplicación (no solo el caché).

Nota : Una copia del archivo problemático de los paquetes de la aplicación en el dispositivo si alguien lo necesita para reprobar.

Bloquear

Fuente

GL

CORONEL Braian
fuente
3

Respuesta completa y oficial para todos:

Diagnóstico: bloqueo de los SDK móviles de la plataforma Google Maps (iOS y Android) al cargarse.

Solución alternativa: * Borre los datos de la aplicación afectada (no solo el caché), o desinstálela y luego vuelva a instalar las aplicaciones afectadas.

  • Solución alternativa de código para iOS:

La ubicación recomendada para el código es antes de la inicialización de GMSServices en la aplicación (_: didFinishLaunchingWithOptions :) (Swift) o aplicación: didFinishLaunchingWithOptions: (Objective-C). Específicamente:

Rápido:

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

C objetivo:

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

Una vez que lo haya implementado en su aplicación, puede presentar un caso de Soporte de Maps si desea que le ayudemos a acelerar su aprobación. Asegúrese de incluir la ID de su aplicación, la ID del paquete y la versión que desea revisar en su caso.

  • Solución alternativa de código para Android:

    La ubicación recomendada para el código está en 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) {
    
    }

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

Zhar
fuente
2

Este es el código de trabajo para Xamarin. Necesita instalar el paquete 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);
}
Jan Nepraš
fuente
1
La última línea no debería leer Preferencias
SET
1
Estás en lo correcto. Lo arreglé.
Jan Nepraš
1

Debes llamar al siguiente método en onCreate de tu aplicación de Android para evitar el bloqueo.

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
                    ?: ""))
        }
    }
Andres Paez
fuente