致命例外:ZoomTableManager

FATAL EXCEPTION: ZoomTableManager

我遇到了一个奇怪的崩溃,我在 Google 上找不到任何相关信息。搜索 ZoomTableManager returns 完全没有结果。

E/AndroidRuntime﹕ FATAL EXCEPTION: ZoomTableManager
Process: com.xxx.yyy, PID: 22129
java.lang.IllegalMonitorStateException: object not locked by thread before notify()
        at java.lang.Object.notifyAll(Native Method)
        at com.google.maps.api.android.lib6.gmm6.m.k.a(Unknown Source)
        at com.google.maps.api.android.lib6.gmm6.m.l.run(Unknown Source)

当您调用 obj.notify() 并且您没有持有 obj.

的原始互斥锁时,会出现带有该消息的 IllegalMonitorStateException

你应该这样做:

    synchronized (someObj) {
        ...
        someObj.notify();
        ...
    }

或等效项,但由于某些原因导致问题的代码遗漏了 synchronized 位。 (或者,它可能已在不同的对象上同步。)

不幸的是,这发生在一些提供 Google 地图 API 实现的混淆代码中。而且您没有提供任何上下文。所以我们几乎不可能猜到发生了什么。

我建议你提供更多的细节。

原来错误的原因是无效的Google地图API键

最近我们不得不更改应用程序的包名称,因此我们使用的 API 密钥变得无效,因为您必须通过签名和包名称指定允许的应用程序。

解决此问题的方法是为您的包裹申请 google 映射 public 密钥。

但是防止这种崩溃的方法是检查调用mapFragment = new MapFragment()的return值,不要调用fm.beginTransaction().replace(id, mapFragment).commit();如果 mapFragment 为空。

希望对您有所帮助。

在我们的例子中,改变的是用于签署 android 应用程序的密钥(而不是 API 密钥)。 在我们使用生产密钥(存储在密钥库中)之前。该生产密钥已在 Google API 控制台 (https://console.developers.google.com) 中启用。

我们在一台新机器上设置了一个新的开发环境,那台机器没有像以前那样使用生产密钥,而是使用 android 的默认调试密钥(存储在 android $HOME/.android/debug.keystore).

中的默认调试密钥库

解决方案是在 Google API 控制台中设置 android 的默认调试密钥、SHA1 和程序包名称。

  1. 获取 SHA1:

    keytool -v -list -keystore $HOME/.android/debug.keystore

  2. 复制 SHA1:27:4C:CF:A3:E9:75:4A:59:4C:EE:50:21:2B:1C:7B:48:FC:45:4F:77

  3. 转到 Google API 控制台并输入 SHA1;程序包名称(在 APIS & Auth > Credentials > Edit allowed Android 申请):

27:4C:CF:A3:E9:75:4A:59:4C:EE:50:21:2B:1C:7B:48:FC:45:4F:77;com.mypackage.name

尽情享受吧!