AndroidRuntime: FATAL EXCEPTION: androidmapsapi-ZoomTableManager


134

Мій додаток, який використовує SDK Google Maps (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)

У бета-версії SDK v3, слід стека:

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
Eduardo Herzer

1
Це виробнича програма чи просто тест?
користувач961186

18
Примітка: Не публікуйте відповідей на це запитання "я теж". Тільки відповіді, які відповідають на питання, слід розміщувати як відповіді.
Вай Ха Лі

3
оновлення будуть тут: issueetracker.google.com/isissue/154855417
lewkka

2
@MidnightGuest Якщо трохи розширити це, це може спричинити гарне запитання.
Макіен

Відповіді:


83

Редагувати : далі - офіційне рішення від Google ( посилання )

Підсумок

Додаток збою SDK Google Maps SDK (ArrayIndexOutOfBoundsException) - Пропозиція

Опис

23 квітня 2020 року, починаючи з 11:30 PDT , Google протягом 4 годин оновлював конфігурацію мобільного компонента Maps, викликаючи збої в SDK-картах для 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

Частота аварійності SDK Maps для Android v2 повертається до норми.

На сьогоднішній день, якщо ви не оновлювали додаток за допомогою вказаних нижче кодів на стороні клієнта, вам не потрібно вживати додаткових дій.

Якщо ви вже оновили додаток із способами вирішення, ви можете видалити його у подальшому оновлення програми (але збереження способу вирішення є безпечним).

SDK Maps Plan Premium для Android v2 або SDK Maps для бета-версії Android v3 (статичні бібліотеки)

Якщо ваш додаток використовує пакет SDK Premium Plan Maps SDK для Android v2 або Maps SDK для бета-версії Android v3 (статичні бібліотеки) і все ще відчуває збої, ми все-таки радимо вам розгорнути наведені нижче способи оновлення через оновлення до вашої програми. Оскільки ваша програма завантажує статичну версію SDK, яка вразлива для поганих даних, що зберігаються на деяких пристроях, проблему може вирішити лише оновлення вашої програми.

Затвердження огляду магазину Play

Якщо ви оновлюєте додаток, але у вас є затримки з переглядом схвалення відгуку в Play Store, будь ласка, подайте заявку на підтримку з ідентифікатором пакета додатка: ⁠ Зверніться до служби підтримки . Наша служба підтримки внутрішньо додасть ваш запит і прискорить його схвалення.

Негативні відгуки в магазині Google Play

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

[1] ⁠ Оцінки та відгуки в Play Store

[2] ⁠ Повідомте про невідповідні відгуки

Карти SDK для iOS

Частота збоїв на iOS повертається до норми. Якщо у вашій програмі все ще виникають збої, вам потрібно оновити та опублікувати додаток за допомогою кодового вирішення, котрий повідомляється тут.

З питаннями щодо розгортання або пришвидшення роботи вашої програми в Apple App Store, зверніться безпосередньо до Apple.


За допомогою цього оновлення ми закриваємо це питання. Дякую всім за терпіння. Наша команда проводить глибоке внутрішнє розслідування цього випадку; як тільки можливо, ми опублікуємо наш аналіз (приблизно через тиждень). Тим часом, якщо у вас є якісь запитання або все ще виникають проблеми, будь ласка, подайте заяву про підтримку .

Обхідні шляхи:

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

  • Кінцеві користувачі на iOS можуть видалити, а потім перевстановити програму, яку стосується.

  • Розробники додатків можуть застосувати наведені нижче кодові шляхи, щоб вирішити проблему для всіх своїх кінцевих користувачів.

Вирішення коду для iOS:

Рекомендоване розміщення коду - перед ініціалізацією GMSServices у програмі (_: didFinishLaunchingWithOptions :) (Swift) або застосунку: didFinishLaunchingWithOptions: метод (Objective-C). Конкретно:

Швидкий:

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:

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 ():

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

}

Котлін

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. Щоб уточнити далі (якщо ви випустили попередню версію способу вирішення, яка не видалила стільки файлів):

  • Програми, які використовують Карти Android SDK v2, повинні видалити лише один файл: ZoomTables.data.
  • Програми, які використовують Maps Android SDK v3 beta, повинні видалити лише один файл

    DATA_ServerCont ManagedParametersManager.data.v1. + getBaseContext (). getPackageName ()) або

    DATA_ServerContilledParametersManager.data. + getBaseContext (). getPackageName ())


1
Наш додаток працює на емуляторі, тому самому коді, але не на виробничому пристрої. Це почало відбуватися під час масштабування. ВИДАЛЕННЯ ЖИТТЯ: androidmapsapi-ZoomTableManager
user961186

1
Помилка в Android.
користувач961186

2
Щойно перевірено, що багато програм, які використовують Map, виходять з ладу, включаючи Uber, Lyft і т.д. Google Maps, здається, працює для мене, він повинен вказувати на іншу кінцеву точку API, відмінну від загальнодоступного API.
AlexVPerl

16
Справжній злочин тут полягає в тому, що навіть коли виклик карт інкапсульований у заяві про спробу / ловити, якимось чином Карти Google перевершує ваш спробу виклику та вибиває програму, а не видавати помилку. Карти повинні викидати належний виняток, коли він недоступний, а не просто руйнувати все.
Бреттінс

2
така ж проблема в Пакистані
Syed Raza Mehdi

44

Здається, у кожному додатку Google Map створює файл ZoomTables.data.

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

Цей файл був неправильно сформований, його неправильна версія може бути завантажена з коментаря . Щоб відтворити проблему, видаліть ZoomTables.data з пакетів програм на пристрої та вставте неправильний. Додаток повинен вийти з ладу.

Наразі цю проблему вирішено на стороні google, але додатки все ще містять кешовану версію цього файлу даних. Щоб вирішити проблему, нам слід видалити цей файл прямо під час запуску програми у методі програми 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) {

  }
}

Оновлення 1

Я оновив обхід, базуючись на останньому коментарі розробників google :

Наведені тут шляхи вирішення охоплюють усі доступні смаки та версії наших SDK для Android. Щоб уточнити далі (якщо ви випустили попередню версію способу вирішення, яка не видалила стільки файлів):

Програми, які використовують Карти Android SDK v2, повинні видалити лише один файл: ZoomTables.data. Програми, які використовують бета-версію Maps Android SDK v3, повинні видалити лише один файл - DATA_ServerContilledParametersManager.data.v1. + getBaseContext (). getPackageName ()) або DATA_ServerContilledParametersManager.data. + getBaseContext (). getPackageName ())


2
Виключення файлу ZoomTables.data працювало на мене. Дуже дякую! Кожен повинен використовувати це і позначити як відповідь!
Едуардо Герцер

@ArthurAttout Так, я швидше роблю це на даний момент і виправляю свої виробничі додатки, які втратили більше 16 годин, ніж чекали більше часу на виправлення Google
Eduardo Herzer

@EduardoHerzer ETA Google триває 48 годин, а повна розробка виробництва займе більше 48 годин. (Оновіть час огляду + час розгортання)
Мухаммед Сакіб

Це працювало для мене! Я лише трохи змінив для свого додатка Flutter: var dir = очікую на getApplicationSupportDirectory (); Файл пошкодженийZoomTables = новий файл (dir.path + "/ZoomTables.data");
csk

Чому ми видаляємо дані ZoomTables.data лише один раз? Що робити, якщо це знову зіпсується?
Ян Непраш

11

Це рішення спрацювало на мене

  1. Перше відкриття "Інформація про додаток"
  2. Виберіть "Зберігання"
  3. Натисніть "Очистити дані"
  4. Відкрийте додаток ще раз і перевірте, чи виправлена ​​проблема.

    Нижче наведено пропозиції лише для того, щоб допомогти своїм клієнтам.

  5. Надішліть електронному листу всім користувачам незручності та опишіть їм проблему, з якою вони стикалися, та надайте їм вищезазначені кроки для вирішення проблеми.

  6. Ви також можете надсилати Push-сповіщення всім своїм користувачам за допомогою Push-повідомлень Firebase, якщо у вашому додатку є послуга 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();
}

довідка: SDK Карт Google виходить з ладу - частково вирішено


Будь ласка, зверніться до issueetracker.google.com/154855417#comment421
miguev

6

Недоліки рішень вище:

  • ZoomTables.data видаляється на кожному пристрої, незалежно від того, чи пристрій впливає на збій чи ні
  • Обхід працює лише один раз, чи впевнений, що ця проблема ніколи не повториться?

Недоліки мого рішення:

  • при першому виконанні карт на активній карті пристрою порожнє. Після обертання пристрою або другого виконання відображається карта

Моє рішення ловить виняток, викинутий SDK Maps, викликайте це в 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 в майбутньому вдасться зробити щось подібне. Я очікую, що там тестування покращиться.
Ifor

Мені довелося очистити сховище, щоб вирішити цю проблему. З будь-якої причини видалення ZoomTables.data було недостатньо для вирішення цього питання. Я видалив у своєму запуску активність onCreate (). Я думаю, я повинен вивчити сферу застосування програми Обробник винятків.
ShellDude

3

Ми вважаємо, що першопричину збоїв SDK на Картах Google виправлено. Виправлення розповсюджується на постраждалі програми та продовжується до розв’язання очікуваними темпами. Повна резолюція, як очікується, завершиться до четверга 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();
    }
}

Обхід : Очистити дані програми (не лише кеш).

Примітка . Копія проблемного файлу з пакетів програм на пристрої, якщо комусь потрібен для повторного запиту.

Блок

Джерело

ГЛ


3

Повна та офіційна відповідь для всіх:

Діагностика: Збій мобільних SDK платформ Google Платформи (iOS та Android) під час завантаження.

Вирішення: * Очистіть дані пошкодженого додатка (не лише кеш-пам'ять) або видаліть, а потім перевстановіть додаток (-ів), про які впливає.

  • Вирішення коду для iOS:

Рекомендоване розміщення коду - перед ініціалізацією GMSServices у програмі (_: didFinishLaunchingWithOptions :) (Swift) або застосунку: didFinishLaunchingWithOptions: метод (Objective-C). Конкретно:

Швидкий:

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:

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 ():

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

    Котлін

    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/isissue/1548554


2

Це робочий код для Xamarin. Потрібно встановити нуметний пакет 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

Вам слід зателефонувати наступному методу в 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
                    ?: ""))
        }
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.