我遇到了一个奇怪的崩溃,我在Google上找不到任何相关内容。搜索 ZoomTableManager 根本不会返回任何结果。
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)
答案 0 :(得分:21)
原来发现错误的原因是无效的Google Maps API密钥。
最近我们不得不更改应用程序的软件包名称,因此我们使用的API密钥无效,因为您必须按签名和软件包名称指定允许的应用程序。
答案 1 :(得分:1)
当您致电IllegalMonitorStateException
并且您没有为obj.notify()
保留原始互斥锁时,会发出包含该消息的obj
。
你应该这样做:
synchronized (someObj) {
...
someObj.notify();
...
}
或等效,但由于某些原因导致问题的代码遗漏了synchronized
位。 (或者,它可以在不同的对象上同步。)
不幸的是,这种情况发生在一些提供Google Maps API实现的混淆代码中。而且您还没有提供任何背景信息。因此,我们几乎不可能猜测正在发生的事情。
我建议您提供更多详细信息。
答案 2 :(得分:0)
解决此问题的方法是申请您的套餐的Google地图公钥。
但阻止此崩溃的方法是检查调用mapFragment = new MapFragment()
的返回值,如果mapFragment为null,则不要调用fm.beginTransaction().replace(id, mapFragment).commit();
。
希望它有所帮助。
答案 3 :(得分:0)
在我们的案例中,改变的是用于签署Android应用程序的密钥(而不是API密钥)。 在我们使用生产密钥(存储在密钥库中)之前。该生产密钥已在Google API控制台(https://console.developers.google.com)中启用。
我们在新机器中设置了一个新的开发环境,并且该机器没有像以前那样使用生产密钥,而是使用了android的默认调试密钥(存储在$ HOME / .android / debug中的android默认调试密钥库中)。密钥库)。
解决方案是在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 < / p>
转到Google API控制台并输入SHA1;包名称(在APIS&amp; Auth&gt; Credentials&gt;编辑允许的Android应用程序中):
27:4C:CF:A3:E9:75:4A:59:4C:EE:50:21:2B:1C:7B:48:FC:45:4F:77; com.mypackage.name
享受!