158

我使用 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)

原因是什么?

4

10 回答 10

100

编辑:以下是谷歌的官方解决方案(链接

概括

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

描述

2020年4 月 23 日太平洋夏令时间 11:30 开始,Google 为地图移动组件的配置提供了 4 小时的更新服务,导致 Android 和 iOS 版地图 SDK 崩溃。下载此版本配置的设备上的应用程序(在中断期间)容易受到崩溃的影响。为 Android 和 iOS 的 Maps SDK 提供了解决方案。

Android 版地图 SDK

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

您应该看到该部分Module Set ID: maps中列出的行Module Sets

Module Set ID: maps, Module Set Version: 2015120015120000

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

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

如果您已经使用变通方法更新了您的应用程序,您可以在应用程序的后续更新中删除该变通方法(但保持变通方法是安全的)。

高级计划 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 提交支持案例:⁠<a href="https://developers.google.com/maps/documentation/android-sdk/support# contact-maps-support" rel="noreferrer">联系支持团队。我们的支持团队将在内部升级您的请求并加快审批。

Google Play 商店中的负面评论

一些应用程序开发人员询问最终用户因崩溃而在 Google Play 商店中留下的 1 星评价。只能删除违反 Google Play 政策 [1] 的评论。您还可以在 Play 管理中心 [ 2 ] 中标记滥用评论。由于负面评论,应用程序不会自动从 Google Play 商店中删除。还值得注意的是,您的整体应用评论评分的计算有利于最近的评论,这意味着您的评分将随着时间的推移恢复到事件前的水平。

[ 1 ] ⁠<a href="https://play.google.com/about/comment-posting-policy/" rel="noreferrer">Play 商店的评分和评论

[ 2 ] ⁠<a href="https://support.google.com/googleplay/android-developer/answer/7318385" rel="noreferrer">举报不当评论

iOS 版地图 SDK

iOS 上的崩溃率已恢复正常。如果您的应用程序仍然遇到崩溃,您需要使用此处传达的代码解决方法更新和发布您的应用程序。

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


通过此更新,我们将关闭此问题。感谢大家的耐心等待。我们的团队正在对此事件进行深入的内部调查;我们将尽快发布我们的分析(大约一周后)。同时,如果您有任何问题,或者仍然遇到问题,请 ⁠<a href="https://developers.google.com/maps/documentation/android-sdk/support#contact-maps-support" rel ="noreferrer">提交支持案例。

解决方法:

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

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

  • 应用程序开发人员可以应用以下代码变通方法,以便为所有最终用户解决问题。

iOS的代码解决方法:

代码的推荐位置是在 application(_:didFinishLaunchingWithOptions:) (Swift) 或 application:didFinishLaunchingWithOptions: (Objective-C) 方法中的 GMSServices 初始化之前。具体来说:

迅速:

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

爪哇

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

}

此处提供的解决方法涵盖了我们适用于 Android 的 SDK 的所有可用风格和版本。进一步澄清(如果您发布了未删除尽可能多文件的解决方法的早期版本):

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

    DATA_ServerControlledParametersManager.data.v1。+ getBaseContext().getPackageName()) 或

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

于 2020-04-23T20:53:23.497 回答
50

似乎在每个应用程序中谷歌地图都会创建 ZoomTables.data 文件。

在此处输入图像描述

这个文件是畸形的,它的畸形版本可以从comment下载。要重现此问题,请从设备上的应用程序包中删除 ZoomTables.data 并插入格式错误的文件。该应用程序应该崩溃。

目前,该问题已在谷歌方面得到解决,但应用程序仍包含该数据文件的缓存版本。要解决这个问题,我们应该在应用程序的 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

我已经更新了解决方法,基于最新的谷歌开发者评论

此处提供的解决方法涵盖了我们适用于 Android 的 SDK 的所有可用风格和版本。进一步澄清(如果您发布了未删除尽可能多文件的解决方法的早期版本):

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

于 2020-04-24T07:18:49.983 回答
14

这个解决方案对我有用

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

  2. 选择“存储”

  3. 点击“清除数据”

  4. 再次打开应用程序并检查问题是否已解决。

    以下建议只是为了帮助您的客户。

  5. 给您的所有用户发送一封电子邮件以表示不便,并向他们描述他们面临的问题,并为他们提供上述步骤来解决他们的问题。

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

截图演示:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

于 2020-04-24T13:35:54.203 回答
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);
    });
}
于 2020-04-24T18:15:18.477 回答
9

为 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

您应该看到该部分Module Set ID: maps中列出的行Module Sets

Module Set ID: maps, Module Set Version: 2015120015120000

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

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

如果您已经使用变通方法更新了您的应用程序,您可以在应用程序的后续更新中删除该变通方法(但保持变通方法是安全的)。


Android 的代码解决方法:

生产版本已修复(在 google 方面),但如果您的模拟器仍有问题,您只需运行以下代码一次。

推荐的代码放置在 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();
    }
}

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

注意:如果有人需要复制,请从设备上的应用程序包中复制有问题的文件。

堵塞

资源

总帐

于 2020-04-24T15:17:28.350 回答
9

对于 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 崩溃 - 部分解决

于 2020-04-24T12:40:25.760 回答
7

所有人的完整和官方答案:

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

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

  • iOS的代码解决方法:

代码的推荐位置是在 application(_:didFinishLaunchingWithOptions:) (Swift) 或 application:didFinishLaunchingWithOptions: (Objective-C) 方法中的 GMSServices 初始化之前。具体来说:

迅速:

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

在您的应用程序中部署它后,如果您希望我们帮助加快其批准速度,您可以提交地图支持案例。请确保在您的案例中包含您的应用程序 ID、Bundle ID 和您想要查看的版本。

  • 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

于 2020-04-26T06:57:51.897 回答
4

您应该在 Android 应用的 onCreate 上调用以下方法以避免崩溃。

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
                    ?: ""))
        }
    }
于 2020-04-28T05:32:23.973 回答
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);
}
于 2020-04-27T06:49:26.707 回答
0

建议的解决方法只会工作一次:

我建议向您的应用发送有关 Google Map Zoom Data Corrupted 的静默推送通知,或进行 API 调用以检查 Google Map Zoom Data 的状态。如果您每次都认为这是不必要的服务器调用,您可以使用推送通知来触发此逻辑,或者与您检查服务器状态的现有调用之一集成。将此留给您的应用程序特定的逻辑。这样做,如果谷歌地图再次抛出此错误,您可以重新触发您的解决方法。

如果服务器调用,这将为您的所有用户重置 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) {

 }
} 


于 2020-05-26T02:57:58.520 回答