AndroidRuntime: EXCEÇÃO FATAL: androidmapsapi-ZoomTableManager

135

Meu aplicativo que usa o SDK do Google Maps (v2) começou a falhar com esta exceção:

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)

No v3 beta SDK, o rastreamento de pilha é:

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 é a causa?

Prem Chand
fonte
10
Talvez seja um problema do Google Maps
Eduardo Herzer 23/04
11
Este é um aplicativo de produção ou apenas um teste?
user961186 23/04
18
Nota: Não poste respostas "eu também" para esta pergunta. Somente respostas que respondam à pergunta devem ser postadas como respostas.
Wai Ha Lee
3
as atualizações estarão aqui: issuetracker.google.com/issues/154855417
lewkka em
2
@ MidnightGuest Se você expandir um pouco isso, pode ser uma boa pergunta.
Makyen 23/04

Respostas:

84

Edit : a seguir é a solução oficial do Google ( link )

Sumário

O segmento do SDK do Google Maps trava o aplicativo (ArrayIndexOutOfBoundsException) - solução oferecida

Descrição

Em 23 de abril de 2020, a partir das 11:30 PDT , o Google exibiu por 4 horas uma atualização da configuração de um componente móvel do Google Maps, provocando falhas nos SDKs do Google Maps para Android e iOS. Os aplicativos em dispositivos que baixaram esta versão da configuração (durante o período de interrupção) estavam vulneráveis ​​à falha. Soluções alternativas são oferecidas para SDKs do Google Maps para Android e iOS.

SDK do Google Maps para Android

SDK do Google Maps para Android v2 (incluído no Google Play Services)

As atualizações do Google Play Services para corrigir a falha foram publicadas em todos os dispositivos com o Google Play Services versão 17.4.55 e mais recente. Não há alterações no número da versão do Google Play Services no dispositivo após a instalação da atualização. Nenhuma ação é necessária de desenvolvedores ou usuários finais para receber o módulo Mapas atualizado; no entanto, os desenvolvedores podem verificar se o módulo está presente em um determinado dispositivo com o seguinte comando adb:

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

Você deve ver a linha Module Set ID: mapslistada na Module Setsseção.

Module Set ID: maps, Module Set Version: 2015120015120000

As taxas de falha do Maps SDK para Android v2 estão de volta ao normal.

A partir de agora, se você não tiver atualizado seu aplicativo com as soluções alternativas de código do cliente mencionadas abaixo, não será necessário executar outras ações.

Se você já atualizou seu aplicativo com as soluções alternativas, poderá remover a solução alternativa em uma atualização subsequente do aplicativo (mas manter a solução alternativa segura).

Plano Premium SDK do Maps para Android v2 ou SDK do Maps para Android v3 beta (bibliotecas estáticas)

Se o seu aplicativo usar o SDK do Maps do plano Premium para Android v2 ou o SDK do Google Maps para Android v3 beta (bibliotecas estáticas) e ainda estiver com falhas, é altamente recomendável que você execute as soluções alternativas abaixo por meio de uma atualização do aplicativo. Como seu aplicativo está carregando uma versão estática do SDK, vulnerável aos dados ruins armazenados em alguns dispositivos, apenas uma atualização para o seu aplicativo pode resolver o problema.

Aprovações de revisão da Play Store

Se você atualizar o aplicativo, mas sofrer atrasos nas aprovações da revisão da Play Store, registre um caso de suporte com o ID do pacote do aplicativo: ⁠ Entre em contato com a equipe de suporte . Nossa equipe de suporte encaminhará sua solicitação internamente e agilizará a aprovação.

Comentários negativos na Google Play Store

Alguns desenvolvedores de aplicativos perguntaram sobre críticas de 1 estrela na Google Play Store deixadas pelos usuários finais devido a falhas. Apenas comentários que violam a política do Google Play [1] podem ser removidos. Você também pode sinalizar críticas abusivas no Play Console [2]. Os aplicativos não serão removidos automaticamente da loja Google Play devido a críticas negativas. Também é importante observar que o cálculo da classificação geral da análise de aplicativos favorece as análises recentes, o que significa que sua classificação se recuperará para níveis pré-incidentes ao longo do tempo.

[1] ⁠ Avaliações e críticas na Play Store

[2] ⁠ Denunciar avaliações inapropriadas

SDK do Google Maps para iOS

As taxas de falhas no iOS estão de volta ao normal. Se o seu aplicativo ainda estiver com falhas, você precisará atualizar e publicar seu aplicativo com as soluções alternativas de código aqui comunicadas.

Para perguntas sobre como implantar ou acelerar seu aplicativo na Apple App Store, entre em contato diretamente com a Apple.


Com esta atualização, estamos encerrando esse problema. Obrigado a todos por sua paciência. Nossa equipe está realizando uma investigação interna aprofundada desse incidente; assim que possível, publicaremos nossa análise (em aproximadamente uma semana). Enquanto isso, se você tiver alguma dúvida ou ainda estiver com problemas, envie um caso de suporte .

Soluções alternativas:

  • Os usuários finais no Android podem limpar os dados do aplicativo afetado (não apenas o cache).

  • Os usuários finais no iOS podem desinstalar e reinstalar os aplicativos afetados.

  • Os desenvolvedores de aplicativos podem aplicar as soluções alternativas de código abaixo para resolver o problema para todos os usuários finais.

Solução alternativa de código para iOS:

O posicionamento recomendado para o código é anterior à inicialização do GMSServices no método aplicativo (_: didFinishLaunchingWithOptions :) (Swift) ou aplicativo: didFinishLaunchingWithOptions: (Objective-C). Especificamente:

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

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

Solução alternativa de código para Android:

O canal recomendado para o código está em 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) {

}

As soluções alternativas fornecidas aqui abrangem todos os tipos e versões disponíveis de nossos SDKs para Android. Para esclarecer mais (caso você tenha lançado uma versão anterior da solução alternativa que não excluiu tantos arquivos):

  • Os aplicativos que usam o SDK do Google Maps para Android v2 só precisam excluir um arquivo: ZoomTables.data.
  • Os aplicativos que usam o SDK para Android do Google Maps v3 beta devem precisar excluir apenas um arquivo,

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

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

Jon
fonte
11
Nosso aplicativo funciona no emulador, mesmo código, mas não em um dispositivo de produção. Começou a acontecer durante o zoom. EXCEÇÃO FATAL: androidmapsapi-ZoomTableManager
user961186 23/04
11
O erro está no Android.
user961186 23/04
2
Acabei de verificar que muitos aplicativos usando o Map estão travando, incluindo Uber, Lyft, etc. O Google Maps parece funcionar para mim; ele deve estar apontando para outro ponto de extremidade da API diferente da API pública.
AlexVPerl
16
O verdadeiro crime aqui é que, mesmo quando a chamada de mapas é encapsulada em uma instrução try / catch, de alguma forma o Google Maps substitui sua chamada de tentativa e trava o aplicativo em vez de gerar um erro. Os mapas devem gerar uma exceção adequada quando não estiver disponível, não apenas travar tudo.
Brettins 23/04
2
mesmo problema no Paquistão
Syed Raza Mehdi
44

Parece que em todos os aplicativos o Google Map cria o arquivo ZoomTables.data.

insira a descrição da imagem aqui

Este arquivo estava com formato incorreto, uma versão malformada dele que poderia ser baixada do comentário . Para reproduzir o problema, remova o ZoomTables.data dos pacotes de aplicativos no dispositivo e insira um malformado. O aplicativo deve falhar.

Atualmente, o problema foi resolvido no lado do Google, mas os aplicativos ainda contêm uma versão em cache desse arquivo de dados. Para corrigir o problema, remova esse arquivo diretamente no aplicativo e inicie no Método 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) {

  }
}

Atualização 1

Atualizei a solução alternativa, com base nos comentários mais recentes dos desenvolvedores do Google :

As soluções alternativas fornecidas aqui abrangem todos os tipos e versões disponíveis de nossos SDKs para Android. Para esclarecer mais (caso você tenha lançado uma versão anterior da solução alternativa que não excluiu tantos arquivos):

Os aplicativos que usam o SDK do Google Maps para Android v2 só precisam excluir um arquivo: ZoomTables.data. Os aplicativos que usam o SDK para Android do Google Maps v3 beta devem precisar excluir apenas um arquivo, DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) ou DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())

Andrey T
fonte
2
Excluir o arquivo ZoomTables.data funcionou para mim. Muito obrigado! Todos devem usar isso e marcar como resposta!
Eduardo Herzer
@ArthurAttout Sim, prefiro fazer isso por enquanto e corrigir meus aplicativos de produção com mais de 16 horas de falha do que esperar mais tempo pela correção do Google
Eduardo Herzer
@EduardoHerzer O ETA do Google é de 48 horas e a implementação completa da produção levará mais de 48 horas. (Tempo de revisão da atualização + tempo de lançamento)
Muhammad Saqib
Isso funcionou para mim! Mudei apenas um pouco para o meu aplicativo Flutter: var dir = waitit getApplicationSupportDirectory (); Arquivo corrompidoZoomTables = novo arquivo (dir.path + "/ZoomTables.data");
csk
Por que removemos o ZoomTables.data apenas uma vez? E se isso for corrompido no futuro novamente?
Jan Nepraš 24/04
11

Esta solução funcionou para mim

  1. Primeiro, abra "Informações do aplicativo"
  2. Escolha "Armazenamento"
  3. Clique em "Limpar dados"
  4. Abra o aplicativo novamente e verifique se o problema foi corrigido.

    Abaixo estão sugestões apenas para ajudar seus clientes.

  5. Envie um e-mail a todos os usuários pelo inconveniente e descreva o problema que eles enfrentaram e dê as etapas acima mencionadas para resolver o problema.

  6. Você também pode enviar notificações por push a todos os usuários com as notificações por push do Firebase, se o seu aplicativo tiver o serviço de notificações por push.

Demonstração de capturas de tela:

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Muhammed Irfan
fonte
6

Para o Android, vários desenvolvedores mencionaram uma solução alternativa que consiste em excluir o arquivo ZoomTable.data diretamente do aplicativo. Após a revisão, essa correção parece segura e você pode tentar em seu aplicativo.

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

Se você deseja que seus usuários continuem usando seu aplicativo sem reinstalar, o código de exemplo é copiado e colado aqui para sua conveniência. Em 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();
}

referência: o SDK do Google Maps está falhando - parcialmente resolvido

Mahmoud Zaher
fonte
6

Desvantagens das soluções acima:

  • O ZoomTables.data é excluído em todos os dispositivos, independentemente de o dispositivo ser afetado pela falha ou não
  • A solução alternativa funciona apenas uma vez. Tem certeza de que esse problema nunca mais acontece?

Desvantagens da minha solução:

  • na primeira execução da atividade de mapas no mapa do dispositivo afetado, está vazio. Após a rotação do dispositivo ou do segundo mapa de execução, aparecer

Minha solução captura a exceção lançada pelo SDK do Google Maps, chame isso em onCreate da 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);
    });
}
Werner Harnisch
fonte
Acabei de enviar uma solução semelhante. Como tenho fontes de mapeamento alternativas para o Google no meu aplicativo, altero a fonte padrão para não ser o Google, além de fornecer ao usuário uma mensagem explicando o que foi feito. Espero que me mantenha seguro se o Google conseguir fazer algo semelhante no futuro. Mas espero que os testes melhorem.
Ifor
Eu tive que limpar o armazenamento para resolver esse problema. Por qualquer motivo, excluir o ZoomTables.data não foi suficiente para resolver isso para mim. Fiz a exclusão na minha atividade de inicialização onCreate (). Eu acho que eu deveria olhar para o escopo do aplicativo Exception Handler.
ShellDude 26/04
3

Acreditamos que a causa raiz das falhas do SDK do Google Maps foi corrigida. A correção está sendo propagada para os aplicativos afetados e continua em direção à resolução no ritmo esperado. Espera-se que a resolução completa seja concluída até quinta-feira, 2020-04-23 19:45 EUA / Pacífico.

A versão produtiva foi corrigida (no lado do google), mas se você ainda tiver problemas com seu emulador, precisará executar o código a seguir apenas uma 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();
    }
}

Solução alternativa : limpe os dados do aplicativo (não apenas o cache).

Nota : Uma cópia do arquivo problemático dos pacotes de aplicativos no dispositivo, se alguém precisar dele para reprodução.

Quadra

Fonte

GL

CORONEL Braian
fonte
3

Resposta completa e oficial para todos:

Diagnóstico: falha nos SDKs para dispositivos móveis da Google Maps Platform (iOS e Android) em carga.

Solução alternativa: * Limpe os dados do aplicativo afetado (não apenas o cache) ou desinstale e reinstale o (s) aplicativo (s) afetado (s).

  • Solução alternativa de código para iOS:

O posicionamento recomendado para o código é anterior à inicialização do GMSServices no método aplicativo (_: didFinishLaunchingWithOptions :) (Swift) ou aplicativo: didFinishLaunchingWithOptions: (Objective-C). Especificamente:

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

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

Depois de implantá-lo em seu aplicativo, você poderá registrar um caso de Suporte do Maps se desejar que ajudemos a acelerar sua aprovação. Certifique-se de incluir o ID do seu aplicativo, o ID do pacote e a versão que você deseja revisar no seu caso.

  • Solução alternativa de código para Android:

    O canal recomendado para o código está em 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) {
    
    }

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

Zhar
fonte
2

Este é um código que funciona para o Xamarin. Você precisa instalar o pacote de nuget do 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š
fonte
11
A última linha não deve ler Preferences.SET (.....
AndyM
11
Você está certo. Eu consertei isso.
Jan Nepraš 28/04
1

Você deve chamar o método a seguir no onCreate do seu aplicativo Android para evitar a falha.

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
fonte