AndroidRuntime: ФАТАЛЬНОЕ ИСКЛЮЧЕНИЕ: androidmapsapi-ZoomTableManager

135

Мое приложение, использующее Google Maps SDK (v2), только что начало сбой, за исключением этого:

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)

В v3 beta SDK трассировка стека выглядит так:

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)

В чем причина?

Прем Чанд
источник
10
Может быть, это проблема Google Maps
Эдуардо Герцер
1
Это производственное приложение или просто тест?
user961186
18
Примечание: не размещайте ответы «Я тоже» на этот вопрос. Только ответы, которые отвечают на вопрос, должны публиковаться как ответы.
Вай Ха Ли
3
обновления будут здесь: issetracker.google.com/issues/154855417
lewkka
2
@MidnightGuest Если вы немного углубитесь в это, это может составить хороший вопрос.
Макьен

Ответы:

84

Изменить : следующее официальное решение от Google ( ссылка )

Резюме

Приложение Google Maps SDK аварийно завершает работу приложения (ArrayIndexOutOfBoundsException) - предлагаемое решение

Описание

23 апреля 2020 года, начиная с 11:30 по тихоокеанскому времени , Google в течение 4 часов обновлял конфигурацию мобильного компонента Maps, вызывая сбои в SDK Maps для Android и iOS. Приложения на устройствах, которые загрузили эту версию конфигурации (в период простоя), были уязвимы для сбоя. Обходные решения предлагаются для карт SDK для Android и iOS.

Карты SDK для Android

Карты SDK для Android v2 (включены в Сервисы Google Play)

Обновления Сервисов Google Play для устранения сбоев были опубликованы на всех устройствах с Сервисами Google Play версии 17.4.55 и новее. После установки обновления номер версии Служб Google Play на устройстве не изменяется. От разработчиков или конечных пользователей не требуется никаких действий для получения обновленного модуля Карт; однако разработчики могут проверить наличие модуля на данном устройстве с помощью следующей команды adb:

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

Вы должны увидеть строку, Module Set ID: mapsуказанную в Module Setsразделе.

Module Set ID: maps, Module Set Version: 2015120015120000

Частота сбоев Maps SDK для Android v2 вернулась к норме.

На данный момент, если вы не обновили свое приложение с помощью обходных путей на стороне клиента, упомянутых ниже, вам не нужно предпринимать дальнейших действий.

Если вы уже обновили свое приложение с помощью обходных путей, вы можете удалить обходной путь в последующем обновлении своего приложения (но сохранение обходного пути безопасно).

Премиум план Maps SDK для Android v2 или Maps SDK для Android v3 beta (статические библиотеки)

Если ваше приложение использует Premium Plan Maps SDK для Android v2 или Maps SDK для Android v3 beta (статические библиотеки) и все еще испытывает сбои, мы по-прежнему настоятельно рекомендуем развернуть указанные ниже обходные пути через обновление вашего приложения. Поскольку ваше приложение загружает статическую версию SDK, которая уязвима для неверных данных, хранящихся на некоторых устройствах, решить проблему может только обновление вашего приложения.

Одобрение обзора Play Store

Если вы обновляете свое приложение, но испытываете задержки одобрения проверки в Play Store, отправьте заявку в службу поддержки с идентификатором пакета вашего приложения: ⁠ Обратитесь в службу поддержки . Наша служба поддержки внутренне обработает ваш запрос и ускорит утверждение.

Отрицательные отзывы в Google Play Store

Некоторые разработчики приложений спрашивали о 1-звездочных отзывах в магазине Google Play, оставленных конечными пользователями из-за сбоев. Только комментарии, которые нарушают политику Google Play [1], могут быть удалены. Вы также можете пометить оскорбительные отзывы в консоли Play [2]. Приложения не будут автоматически удалены из магазина Google Play из-за отрицательных отзывов. Стоит также отметить, что подсчет общего рейтинга ваших обзоров приложений благоприятствует последним обзорам, что означает, что ваш рейтинг со временем восстановится до уровня, предшествующего инцидентам.

[1] ⁠ Рейтинги и обзоры в магазине Play

[2] ⁠ Сообщить о неуместных отзывах

Карты SDK для iOS

Показатели аварий на iOS вернулись к норме. Если ваше приложение все еще испытывает сбои, вам необходимо обновить и опубликовать свое приложение с помощью описанных здесь обходных путей кода.

По вопросам развертывания или ускорения работы приложения в Apple App Store обращайтесь напрямую в Apple.


Этим обновлением мы закрываем эту проблему. Спасибо всем за терпение. Наша команда проводит углубленное внутреннее расследование этого инцидента; как можно скорее, мы опубликуем наш анализ (примерно через неделю). В то же время, если у вас есть какие-либо вопросы или у вас все еще есть проблемы, пожалуйста, подайте заявку в службу поддержки .

обходные:

  • Конечные пользователи на Android могут очистить данные уязвимого приложения (а не только кеш).

  • Конечные пользователи на iOS могут удалить и переустановить уязвимые приложения.

  • Разработчики приложений могут применить обходные пути кода ниже, чтобы решить проблему для всех своих конечных пользователей.

Обход кода для iOS:

Рекомендуемое размещение кода перед инициализацией GMSServices в приложении (_: didFinishLaunchingWithOptions :) (Swift) или в приложении: didFinishLaunchingWithOptions: (Objective-C). В частности:

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

Обход кода для Android:

Рекомендуемое размещение кода в Application.onCreate ():

Ява

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

}

Котлин

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

}

Обходные пути, представленные здесь, охватывают все доступные версии и версии наших SDK для Android. Для уточнения (в случае, если вы выпустили более раннюю версию обходного пути, которая не удаляла столько файлов):

  • Приложения, использующие Maps Android SDK v2, должны удалять только один файл: ZoomTables.data.
  • Приложения, использующие бета-версию Maps Android SDK v3, должны удалять только один файл.

    DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) или

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

джон
источник
1
Наше приложение работает на эмуляторе, тот же код, но не на рабочем устройстве. Это начало происходить во время масштабирования. Неустранимое исключение: androidmapsapi-ZoomTableManager
user961186
1
Ошибка на Android.
user961186
2
Только что проверил сбой многих приложений, использующих Map, в том числе Uber, Lyft и т. Д. Google Maps, кажется, работает для меня, он должен указывать на другую конечную точку API, отличную от общедоступного API.
AlexVPerl
16
Реальное преступление здесь в том, что даже когда вызов maps инкапсулирован в оператор try / catch, Google Maps каким-то образом заменяет ваш вызов try и вылетает из приложения, а не выдает ошибку. Карты должны выдавать правильное исключение, когда оно недоступно, а не просто сбой всего.
Бреттинс
2
та же проблема в Пакистане
Сайед Раза Мехди
44

Кажется, в каждом приложении Google Map создает файл ZoomTables.data.

введите описание изображения здесь

Этот файл был неверно сформирован, его версия была загружена из комментария . Чтобы воспроизвести проблему, удалите ZoomTables.data из пакетов приложений на устройстве и вставьте поврежденный. Приложение должно вылететь.

В настоящее время проблема была решена на стороне Google, но приложения все еще содержат кэшированную версию этого файла данных. Чтобы решить эту проблему, мы должны удалить этот файл прямо при запуске приложения в Application onCreate Method.

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

  }
}

Обновление 1

Я обновил обходной путь, основываясь на последнем комментарии разработчиков Google :

Обходные пути, представленные здесь, охватывают все доступные версии и версии наших SDK для Android. Для уточнения (в случае, если вы выпустили более раннюю версию обходного пути, которая не удаляла столько файлов):

Приложения, использующие Maps Android SDK v2, должны удалять только один файл: ZoomTables.data. Приложения, использующие бета-версию Maps Android SDK v3, должны удалять только один файл: DATA_ServerControlledParametersManager.data.v1. + getBaseContext (). getPackageName ()) или DATA_ServerControlledParametersManager.data. + getBaseContext (). getPackageName ())

Андрей Т
источник
2
Исключая файл ZoomTables.data работал для меня. Большое спасибо! Каждый должен использовать это и отметить как ответ!
Эдуардо Герцер
@ArthurAttout Да, я скорее делаю это сейчас и исправляю свои производственные приложения, которые разбились более чем на 16 часов, чем ожидают больше времени для исправления Google
Эдуардо Герцер
@ EduardoHerzer ETA Google составляет 48 часов, а полное развертывание производства займет более 48 часов. (Обновление времени обзора + время
выпуска
Это сработало для меня! Я немного изменил свое приложение Flutter: var dir = await getApplicationSupportDirectory (); Файл поврежденZoomTables = новый файл (dir.path + "/ZoomTables.data");
csk
Почему мы удаляем ZoomTables.data только один раз? Что если это снова будет повреждено в будущем?
Ян Непраш
11

Это решение сработало для меня

  1. Сначала откройте «Информация о приложении»
  2. Выберите «Хранение»
  3. Нажмите «Очистить данные»
  4. Снова откройте приложение и проверьте, устранена ли проблема.

    Ниже приведены предложения, чтобы помочь вашим клиентам.

  5. Отправьте электронное письмо всем своим пользователям за причиненные неудобства, опишите им проблему, с которой они столкнулись, и дайте им вышеупомянутые шаги для решения их проблемы.

  6. Вы также можете отправлять Push-уведомления всем своим пользователям с помощью Firebase Push-уведомлений, если в вашем приложении есть служба push-уведомлений.

Демонстрация скриншотов:

введите описание изображения здесь

введите описание изображения здесь

введите описание изображения здесь

Мухаммед Ирфан
источник
6

Для Android несколько разработчиков упомянули обходной путь, заключающийся в удалении файла ZoomTable.data непосредственно из их приложения. После проверки это исправление кажется безопасным, и вы можете попробовать его в своем приложении.

Пожалуйста, обратитесь к https://issuetracker.google.com/154855417#comment179

Если вы хотите, чтобы пользователи продолжали использовать ваше приложение без переустановки, образец кода скопирован сюда для вашего удобства. В 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();
}

ссылка: Google Maps SDK падает - частично решена

Махмуд Захер
источник
Пожалуйста, обратитесь к issetracker.google.com/154855417#comment421
miguev
6

Недостатки решения выше:

  • ZoomTables.data удаляется на каждом устройстве, независимо от того, на устройстве происходит сбой или нет
  • Обходной путь работает только один раз, уверен, что эта проблема никогда не повторится?

Недостатки моего решения:

  • при первом выполнении карт активность на затронутом устройстве карта пуста. После поворота устройства или второго исполнения отображается карта

Мое решение перехватывает исключение, которое выдает SDK для карт, вызовите его в onCreate класса 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);
    });
}
Вернер Харниш
источник
Я только что вытолкнул аналогичный обходной путь. Поскольку в моем приложении есть альтернативные источники сопоставления с Google, я изменяю источник по умолчанию, чтобы он не был Google, а также предоставлял пользователю сообщение, объясняющее, что было сделано. Надеюсь, это сохранит мою безопасность, если Google удастся сделать что-то подобное в будущем. Я надеюсь, что тестирование улучшится.
Ифор
Мне пришлось очистить хранилище, чтобы решить эту проблему. По какой-то причине удаление ZoomTables.data было недостаточно, чтобы решить эту проблему для меня. Я сделал удаление в моей деятельности при запуске onCreate (). Я думаю, что я должен посмотреть в область применения Exception Handler.
ShellDude
3

Мы считаем, что основная причина сбоев Google Maps SDK была устранена. Исправление распространяется на уязвимые приложения и продолжается в направлении разрешения с ожидаемой скоростью. Ожидается, что полное разрешение будет завершено к четвергу 2020-04-23 19:45 США / Тихоокеанский регион.

Продуктивная версия была исправлена ​​(на стороне Google), но если у вас все еще есть проблемы с вашим эмулятором, вы должны запустить следующий код только один раз.

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

Обходной путь : Очистить данные приложения (не только кеш).

Примечание . Копия проблемного файла из пакетов приложений на устройстве, если кому-либо он нужен для воспроизведения.

блок

Источник

GL

КОРОНЕЛЬ Брайан
источник
3

Полный и официальный ответ для всех:

Диагностика: сбой мобильных SDK Google Maps Platform (iOS и Android) при загрузке.

Обходной путь: * Очистите данные уязвимого приложения (не только кеш) или удалите, а затем переустановите уязвимое приложение (я).

  • Обход кода для iOS:

Рекомендуемое размещение кода перед инициализацией GMSServices в приложении (_: didFinishLaunchingWithOptions :) (Swift) или в приложении: didFinishLaunchingWithOptions: (Objective-C). В частности:

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

Развернув его в своем приложении, вы можете подать заявку в службу поддержки Карт, если вы хотите, чтобы мы ускорили его утверждение. Обязательно укажите идентификатор своего приложения, идентификатор комплекта и версию, которую вы хотите просмотреть в вашем случае.

  • Обход кода для Android:

    Рекомендуемое размещение кода в Application.onCreate ():

    Ява

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

    Котлин

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

Источник: https://issuetracker.google.com/issues/1548554

Жар
источник
2

Это рабочий код для Xamarin. Вам необходимо установить пакет 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
Не должна ли последняя строка читать Preferences.SET (.....
AndyM
1
Ты прав. Я починил это.
Ян Непраш
1

Вы должны вызвать метод follow в onCreate вашего приложения для Android, чтобы избежать сбоя.

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
                    ?: ""))
        }
    }
Андрес Паес
источник