致命例外: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 和程序包名称。
获取 SHA1:
keytool -v -list -keystore $HOME/.android/debug.keystore
复制 SHA1:27:4C:CF:A3:E9:75:4A:59:4C:EE:50:21:2B:1C:7B:48:FC:45:4F:77
转到 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
尽情享受吧!
我遇到了一个奇怪的崩溃,我在 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 和程序包名称。
获取 SHA1:
keytool -v -list -keystore $HOME/.android/debug.keystore
复制 SHA1:27:4C:CF:A3:E9:75:4A:59:4C:EE:50:21:2B:1C:7B:48:FC:45:4F:77
转到 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
尽情享受吧!