Android运行时错误:androidmapsapi-ZoomTableManager致命异常

158

我使用的 Google 地图 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)

什么是原因?


12
可能是谷歌地图的问题。 - Eduardo Herzer
23
请勿把“我也是”的回答发到这个问题中。只有直接回答问题的答案才应该作为答案发布。 - Wai Ha Lee
4
更新将会发布在这个网址上:https://issuetracker.google.com/issues/154855417 - lewkka
3
如果你能再详细说明一下,这会成为一个不错的问题。 - Makyen
显示剩余11条评论
10个回答

100

Edit: 下面是来自谷歌官方的解决方案(链接

概述

Google Maps SDK线程导致应用崩溃(ArrayIndexOutOfBoundsException) - 提供解决方案

描述

2020年4月23日PDT 11:30开始的4个小时内,Google更新了Maps移动组件的配置,触发了Android和iOS的Maps SDK崩溃。在停运期间下载了此版本配置的设备上的应用程序容易受到崩溃的影响。为Android和iOS的Maps SDK提供了解决方法。

Maps SDK for Android

Maps SDK for Android v2 (包含在Google Play服务中)

修复崩溃的Google Play服务更新已发布到所有安装有Google Play服务版本17.4.55及更高版本的设备上。更新安装后,设备上的Google Play服务版本号不会更改。开发人员或终端用户无需采取任何措施即可接收更新的Maps模块;但是,开发人员可以使用以下adb命令验证给定设备上是否存在该模块:

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

模块集部分中,您应该看到列出了模块设置ID:maps这一行。

Module Set ID: maps, Module Set Version: 2015120015120000

Maps SDK for Android v2的崩溃率已恢复正常。

目前,如果您尚未使用下面提到的客户端代码解决方法更新应用程序,则无需采取进一步措施。

如果您已经使用了解决方法更新了您的应用程序,则可以在随后的应用程序更新中删除解决方法(但保留解决方法是安全的)。

Premium Plan Maps SDK for Android v2或Maps SDK for Android v3 beta(静态库)

如果您的应用程序使用Premium Plan Maps SDK for Android v2或Maps SDK for Android v3 beta(静态库),并仍然遇到崩溃问题,我们仍强烈建议您通过应用程序的更新来推出以下解决方法。由于您的应用程序正在加载易受某些设备上存储的错误数据攻击的SDK的静态版本,因此只有通过应用程序的更新才能解决问题。

Play商店评论批准

如果您更新了应用程序,但遇到Play商店评论批准的延迟,请使用应用程序的包ID提交支持案例:⁠联系支持团队。我们的支持团队将内部升级您的请求并加快批准。

Google Play商店中的负面评价

一些应用程序开发者询问了由于崩溃而由终端用户在Google Play商店中留下的1星级评价。只有违反Google Play政策[1]的评论才能被删除。您还可以在Play控制台[2]中标记滥用评论。应用程序不会自动从Google Play商店中删除由于负面评价而导致的问题。值得注意的是,您的整体应用程序评价评分计算偏向最近的评价,这意味着您的评分会随时间恢复到事前水平。

[1] ⁠Play商店上的评分和评论

[2] ⁠报告不当评论

iOS地图SDK

iOS的崩溃率已恢复正常。如果您的应用程序仍然遇到崩溃问题,则需要更新并发布您的应用程序,并使用此处提供的代码解决方法。

有关在Apple App Store中部署或加速应用程序的问题,请直接与Apple联系。


通过此更新,我们正在关闭此问题。感谢大家的耐心等待。我们的团队正在对此事件进行深入的内部调查;尽快,我们将在一周左右发表我们的分析。与此同时,如果您有任何疑问或仍然遇到问题,请⁠提交支持案例

解决方法:

  • Android上的终端用户可以清除受影响应用程序的数据(而不仅仅是缓存)。

  • iOS上的终端用户可以卸载,然后重新安装受影响的应用程序。

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

    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

    ->

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

    这里提供的解决方案涵盖了我们针对 Android 平台的所有可用 SDK 类型和版本。为了进一步澄清(万一您发布了早期版本的解决方案,其中未删除尽可能多的文件):

    • 使用 Maps Android SDK v2 的应用程序只需要删除一个文件:ZoomTables.data。
    • 使用 Maps Android SDK v3 beta 的应用程序只需要删除一个文件,

      EITHER DATA_ServerControlledParametersManager.data.v1. + getBaseContext().getPackageName() OR DATA_ServerControlledParametersManager.data. + getBaseContext().getPackageName()


1
我们的应用程序在模拟器上运行,使用相同的代码,在生产设备上却无法运行。这种情况发生在缩放时。FATAL EXCEPTION: androidmapsapi-ZoomTableManager。 - user961186
嗯,谷歌地图应用程序目前在Android上运行,但在iOS上不可用。 - Midnight Guest
2
刚刚检查了许多使用地图的应用程序都崩溃了,包括Uber、Lyft等。Google Maps 对我来说似乎可以正常使用,它一定是指向另一个API端点,与公共API不同。 - AlexVPerl
16
这里真正的问题是,即使将地图调用封装在try/catch语句中,Google Maps仍然会取代您的try调用并崩溃应用程序,而不是抛出错误。地图应该在不可用时抛出适当的异常,而不是让一切都崩溃。 - Brettins
2
巴基斯坦遇到了同样的问题。 - Syed Raza Mehdi
显示剩余3条评论

50

似乎在每个Google Map应用程序中都会创建ZoomTables.data文件。

enter image description here

该文件存在格式问题,可以从评论中下载其格式有误的版本。 要重现此问题,请从设备上的应用程序包中删除ZoomTables.data并插入格式有误的文件。然后应用将会崩溃。 目前,该问题已在Google端解决,但应用程序仍然包含缓存版本的该数据文件。 为解决此问题,我们应该在应用程序启动时在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) {

  }
}

更新1

根据Google开发人员的最新评论,我已经更新了解决方法:

这里提供的解决方法涵盖了Android SDK的所有可用版本和味道。为了进一步澄清(以防您发布了一个未删除尽可能多文件的早期版本的解决方法):

使用地图Android SDK v2的应用程序只需要删除一个文件:ZoomTables.data。 使用Maps Android SDK v3 beta的应用程序只需要删除一个文件,即DATA_ServerControlledParametersManager.data.v1. + getBaseContext().getPackageName()或DATA_ServerControlledParametersManager.data. + getBaseContext().getPackageName()。


3
不包括ZoomTables.data文件对我有用。非常感谢!每个人都应该使用这个并将其标记为答案! - Eduardo Herzer
1
@ArthurAttout 是的,我现在宁愿这样做,并修复我的生产应用程序,这些应用程序已经崩溃了16个小时以上,而不是等待更长时间来等待Google的修复方案。 - Eduardo Herzer
1
@EduardoHerzer 谷歌的预计时间为48小时,完全推出生产将需要超过48小时。(更新审核时间+推出时间) - Muhammad Saqib
1
这对我有用!我只是为我的Flutter应用程序做了一点改变: var dir = await getApplicationSupportDirectory(); File corruptedZoomTables = new File(dir.path + "/ZoomTables.data"); - csk
1
为什么我们只删除ZoomTables.data一次?如果将来再次损坏怎么办? - Jan Nepraš
谷歌新的官方解决方法:https://issuetracker.google.com/issues/154855417#comment465。请更新答案。 - Eduardo Herzer

14

这个解决方案对我有用

  1. 首先打开“应用信息”

  2. 选择“存储”

  3. 点击“清除数据”

  4. 重新打开应用并检查问题是否已经解决。

    以下是一些建议,以帮助您的客户。

  5. 向所有用户发送电子邮件以表达歉意,并向他们描述他们遇到的问题,并给出上述步骤以解决其问题。

  6. 如果您的应用程序具有推送通知服务,则还可以使用Firebase Push Notifications向所有用户发送推送通知。

演示截图:

输入映像描述

输入映像描述

输入映像描述


OP 正在努力理解是什么原因导致了这个问题,以便能够永久性地解决它,而不是仅仅在自己的手机上解决,直到下一次发生。从设备中删除状态会破坏调试此问题所必需的数据。 - TZubiri

10

iOS和Android的解决方案:

https://issuetracker.google.com/issues/154855417#comment509

Maps SDK for 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

您应该在 模块集 部分中看到列出的行 模块设置 ID:maps

Module Set ID: maps, Module Set Version: 2015120015120000
Maps SDK for Android v2 的崩溃率已恢复正常。目前,如果您尚未使用下面提到的客户端代码解决方法更新您的应用程序,则无需采取进一步行动。如果您已经使用了这些解决方法更新了应用程序,您可以在随后的应用程序更新中删除解决方法(但保留解决方法是安全的)。
Android的代码解决方法: 生产版本已经修复(在谷歌方面),但是如果您的模拟器仍然存在问题,您需要只运行以下代码一次。 建议将代码放置在Application.onCreate()中。
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();
    }
}

解决方法: 清除应用程序数据(不仅是缓存)。

注意: 如果有人需要进行再现,则可以从设备上的应用程序包中获取有问题的文件的副本。

Block

来源

GL


10

上述解决方案的缺点:

  • ZoomTables.data在每个设备上都被删除,无论该设备是否受到崩溃的影响
  • 解决方法只能使用一次,无法保证这个问题不会再次发生

我的解决方案的缺点:

  • 在受影响设备的第一次执行地图活动时,地图为空。在设备旋转或第二次执行后,地图将显示出来

我的解决方案捕获了Maps SDK抛出的异常,在Application类的onCreate中调用它:

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采取类似措施时保持安全。我确实希望他们的测试能够得到改善。 - Ifor
我不得不清除存储以解决这个问题。出于某种原因,仅删除ZoomTables.data对我来说并不足以解决这个问题。我在我的启动活动onCreate()中执行了删除操作。我想我应该研究一下应用程序范围的异常处理程序。 - ShellDude

9

针对安卓系统,多个开发人员提出了一种解决方法,即直接从其应用程序中删除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 崩溃 -- 部分解决方案


请参考 https://issuetracker.google.com/154855417#comment421。 - miguev

7

关于所有问题的完整官方答案:

诊断:Google Maps平台移动SDK(iOS和Android)在加载时崩溃。

解决方法:* 清除受影响应用程序的数据(不仅仅是缓存),或卸载再重新安装受影响的应用程序。

  • iOS的代码解决方法:

建议将代码放置在application(_:didFinishLaunchingWithOptions:)(Swift)或application:didFinishLaunchingWithOptions:(Objective-C)方法中GMSServices初始化之前。具体来说:

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

一旦您在应用程序中部署了它,如果您希望我们帮助加快其批准过程,您可以提交一个地图支持案例。请确保在案例中包含您的应用程序ID、Bundle ID和要审核的版本。

  • Code workaround for Android:

    The recommended placement for the code is in 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) {
    
    }
    

来源: https://issuetracker.google.com/issues/1548554

这个问题是关于在Android设备上使用VPN时,连接断开后无法自动重新连接的。目前,Google正在调查此问题并寻找解决方案。如果您遇到了这个问题,请耐心等待更新或尝试手动重新连接VPN。


4

为避免崩溃,请在Android应用程序的onCreate方法中调用follow方法。

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

3

这是Xamarin的可用代码。您需要安装Xamarin.Essentials nuget包。

if (!Preferences.Get("google_bug_fixed", false))
{
    var corruptedZoomTables = new File(FileSystem.AppDataDirectory, "ZoomTables.data");
    corruptedZoomTables.Delete();
    Preferences.Set("google_bug_fixed", true);
}

0

建议的解决方法只能使用一次:

我建议向您的应用程序发送静默推送通知,提醒Google地图缩放数据已损坏或调用API检查Google地图缩放数据的状态。如果您认为这是不必要的服务器调用,您可以使用推送通知触发此逻辑或与您现有的调用之一集成,其中您检查服务器状态。将此留给您的应用程序特定逻辑。这样做,如果Google Maps再次引发此错误,您可以重新触发您的解决方法。

如果是服务器调用,则会重置所有用户的ZoomData。 如果是推送通知,则可以向某些用户发送通知。


fun receivedPushNotificationZoomDataCorrupted() {
 try {
        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()
    }
 } catch (exception: Exception) {

 }
} 



网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接