致命例外: androidmapsapi-ZoomTableManager

我的应用程序使用谷歌地图 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)


病因是什么?

12390 次浏览

编辑 : 以下是 Google 的官方解决方案(链接)

摘要

谷歌地图 SDK 线程崩溃应用程序(ArrayIndexOutOfbound sException)-提供的解决方案

描述

2020年4月23日,太平洋夏令时11:30开始上,谷歌对 Maps 移动组件的配置进行了4个小时的更新,触发了 Android 和 iOS 的 Maps SDK 崩溃。下载此版本配置的设备上的应用程序(在停机期间)很容易受到崩溃的影响。为 Android 和 iOS 的 Maps SDK 提供了解决方案。

Android 版 SDK 地图

为 Android v2绘制 SDK 地图(包含在 Google Play Services 中)

修复崩溃的 Google Play Services 更新已经发布到所有使用 Google Play Services 17.4.55及更新版本的设备上。安装更新后,设备上的 GooglePlayServices 版本号没有变化。不需要开发人员或最终用户采取任何行动来接收更新后的 Maps 模块; 但是,开发人员可以使用以下 adb 命令验证该模块是否存在于给定设备上:

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

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

Module Set ID: maps, Module Set Version: 2015120015120000

Android v2版本中 Maps SDK 的崩溃率已经恢复正常。

到目前为止,如果您还没有使用下面提到的客户端代码解决方案更新您的应用程序,那么您不需要采取进一步的行动。

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

Premium Plan Maps SDK for Androidv2或 Maps SDK for Androidv3beta (静态库)

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

播放商店审查批准

如果您更新您的应用程序,但经历播放商店审查批准延迟,请提交一个支持案件与您的应用程序的软件包 ID: 联系支持小组。我们的支持团队会在内部提高您的要求,并加快批准。

Google Play Store 中的负面评论

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

[1] 游戏商店的评级与评论

[2] 报告不恰当的评论

为 iOS 映射 SDK

IOS 系统的崩溃率已经恢复正常。如果您的应用程序仍然在经历崩溃,您需要更新和发布您的应用程序与代码工作区沟通在这里。

有关在苹果应用程序商店部署或加速应用程序的问题,请直接与苹果联系。


通过这次更新,我们将结束这个问题。感谢大家的耐心等待。我们的团队正在对这一事件进行深入的内部调查; 我们将尽快公布我们的分析(大约一周后)。与此同时,如果您有任何问题,或仍然遇到问题,请 提出支持案件

变通方法:

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

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

  • 应用程序开发人员可以应用下面的代码变通方法来解决 所有终端用户的问题

IOS 的代码解决方案:

建议代码放置在应用程序(_: did FinishLaunchingWithOptions:)(Swift)或应用程序: did FinishLaunchingWithOptions: (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测试版的应用程序只需要 删除一个文件

    DATA _ ServerControlledParameter tersManager. DATA.v1. + GetBaseContext () . getPackageName () 或者

    数据。 + GetBaseContext () . getPackageName ()

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

enter image description here

这个文件是畸形的,畸形的版本,可以从 评论下载。 要重现这个问题,请从设备上的应用程序包中删除 ZoomTables.data,并插入一个畸形的数据包。应用程序应该会崩溃。

目前,这个问题已经在谷歌方面得到解决,但应用程序仍然包含该数据文件的缓存版本。 为了解决这个问题,我们应该在 ApplicationonCreateMethod 的应用程序启动时删除该文件。

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 _ ServerControlledParameter tersManager。Data.v1.+ getBaseContext ().GetPackageName ()或 DATA _ ServerControlledParameter tersManager。资料。+ getBaseContext ().GetPackageName ()

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

这个办法对我很有效

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

  2. 选择「储存」

  3. 点击“清除数据”

  4. 再次打开应用程序,检查问题是否修复。

    下面是一些帮助客户的建议。

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

  6. 如果你的应用程序有推送通知服务,你也可以通过 Firebase 推送通知发送推送通知给你的所有用户。

截图示范:

enter image description here

enter image description here

enter image description here

为 iOS 和 Android 提供的解决方案:

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

为 Android v2绘制 SDK 地图(包含在 Google Play Services 中)

修复崩溃的 Google Play Services 更新已经发布到所有使用 Google Play Services 17.4.55及更新版本的设备上。安装更新后,设备上的 GooglePlayServices 版本号没有变化。不需要开发人员或最终用户采取任何行动来接收更新后的 Maps 模块; 但是,开发人员可以使用以下 adb 命令验证该模块是否存在于给定设备上:

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

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

Module Set ID: maps, Module Set Version: 2015120015120000

Android v2版本中 Maps SDK 的崩溃率已经恢复正常。

到目前为止,如果您还没有用客户端代码更新您的应用程序 下面提到的解决方法,你不需要采取进一步的行动。

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


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

上述解决方案的缺点:

  • 不管设备是否受到崩溃的影响,在每个设备上都会删除 ZoomTables.data
  • 解决方案只能工作一次,是否确定这个问题不会再发生?

我的解决方案的缺点:

  • 在第一次执行映射时,受影响的设备映射上的活动是空的。显示设备旋转或第二次执行映射之后

我的解决方案捕获 Maps SDK 抛出的 Exception,调用 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);
});
}

完整和正式的答案:

诊断: 谷歌地图平台移动 SDK (iOS 和 Android)在加载时崩溃。

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

  • IOS 的代码解决方案:

建议代码放置在应用程序(_: did FinishLaunchingWithOptions:)(Swift)或应用程序: did FinishLaunchingWithOptions: (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,捆绑 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) {
    
    
    }
    

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

这是 Xamarin 的工作代码。您需要安装 Xamarin。

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

您应该在您的 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
?: ""))
}
}

建议的解决办法只有一次有效:

我建议发送一个无声的推送通知到您的应用程序关于谷歌地图缩放数据损坏或作出 API 调用,以检查谷歌地图缩放数据的状态。如果每次都认为这是不必要的服务器调用,那么可以使用推送通知来触发这种逻辑,或者与检查服务器状态的现有调用集成。把这个问题留给你的应用程序特定的逻辑。这样做,如果谷歌地图再次抛出这个错误,您可以重新触发您的解决方案。

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


}
}