安卓中 Google 地图签名 API 密钥错误

63

当我从我的调试地图密钥切换到签名地图密钥时,我的地图停止工作。在logcat中出现以下错误:

09-03 18:18:04.112: WARN/System.err(4073): IOException processing: 26
09-03 18:18:04.112: WARN/System.err(4073): java.io.IOException: Server returned: 3
09-03 18:18:04.112: WARN/System.err(4073):     at android_maps_conflict_avoidance.com.google.googlenav.map.BaseTileRequest.readResponseData(BaseTileRequest.java:115)
09-03 18:18:04.112: WARN/System.err(4073):     at android_maps_conflict_avoidance.com.google.googlenav.map.MapService$MapTileRequest.readResponseData(MapService.java:1473)
09-03 18:18:04.112: WARN/System.err(4073):     at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher.processDataRequest(DataRequestDispatcher.java:1117)
09-03 18:18:04.112: WARN/System.err(4073):     at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher.serviceRequests(DataRequestDispatcher.java:994)
09-03 18:18:04.112: WARN/System.err(4073):     at android_maps_conflict_avoidance.com.google.googlenav.datarequest.DataRequestDispatcher$DispatcherServer.run(DataRequestDispatcher.java:1702)
09-03 18:18:04.112: WARN/System.err(4073):     at java.lang.Thread.run(Thread.java:1019)

我已经仔细检查了一切,权限和库都已就位。我已重新创建了签名密钥,但没有运气。

有什么想法吗?


请发布抛出异常的代码。 - Nikola Despotoski
我曾经遇到过同样的问题,它曾经工作过一次,但之后每次运行时都只加载了一个灰色网格,并出现了你发布的相同错误。 - dylan murphy
4
你应该接受对你有用的答案 :) - Sagar Hatekar
2
@SagarHatekar 哈哈,我知道!我一直在这里,只是显然很久没登录了。 - Jen
10个回答

86

我曾经遇到过同样的问题,但在互联网上找不到有用的答案,因此希望这篇文章能够帮助未来需要解决类似问题的人。

在使用 GoogleMaps for Android 时,你需要两个密钥 - 调试密钥和发布密钥。

“调试”密钥是一个有误导性的术语。在使用Eclipse开发应用程序时,也要使用此密钥。因此,将调试密钥用于开发、测试和调试。

当你准备将应用程序推向市场时,在AndroidManifest.xml中设置 android:debuggable="false" 并使用签名API密钥。

当使用签名 API 密钥时,只有从 Android Market 安装应用程序时, MapView 才会显示出来。因此,从 Eclipse(运行、调试等)或命令行(adb install)安装应用程序时不会显示 MapView。请放心,一旦应用程序在市场上下载, MapView 就会显示出来。

使用签名 API 密钥时,如果从Eclise部署应用程序,则会收到“服务器返回3, IOProcessing Exception 26”的警告-请忽略它。

注意:还要确保没有重复的 MapView 实例。如果您的应用程序需要“x”个MapView,则为每个 MapView 生成“x”个新的签名密钥(每个一个),因为GoogleMaps对于单个 MapView 实例有一个查询限制。

获取这两个密钥,请按照在 Android 上获取 GoogleMaps API 密钥 的步骤操作。

编程愉快!

更新:

上面获取 API 密钥的链接现在是一个被弃用的过程。请参考获取 GoogleMaps Android API v2 的 API 密钥 进行操作。


11
为了准确起见:"当使用签名API密钥时,只有在从Android市场安装应用程序时才会显示MapView。因此,从Eclipse(Run As,Debug As等)或命令行(adb install)安装应用程序不会显示MapView。请放心,一旦应用程序在市场上 - 您下载它,MapView将显示出来。" - 这并不完全正确。实际上,如果使用您向Google申请Maps密钥时提供的密钥对应用程序进行签名,则MapView将按预期工作。如果您使用这个密钥进行签名,那么从命令行安装它也是可以工作的。 - BoD
我对这个问题感到困惑...我们为客户提供了一个工作地图,但它无论是从市场还是其他来源安装都可以正常运行。有一天,我们意识到它再也无法正常工作了。事实上,我们不得不更改我们的签名证书,并遗漏了将其提供给谷歌... - Schlangi
@IgorGanapolsky 如果您使用调试密钥,可以在调试模式下查看MapKey。 - Sagar Hatekar
如果“坏键”情况下出现完全相同的症状,我该如何放心?或者我怎样才能确定呢? - halxinate
请注意,如果我理解正确的话,在某些情况下,debuggable false是不必要的:https://dev59.com/xG025IYBdhLWcg3w9quQ#5701672 - span
显示剩余3条评论

3

终于解决了。

我使用的是Windows电脑,所以我直接进入 C:\Users\rohit\.android,删除了 debug.keystoredefault.keyset1 文件。完成后,我回到Eclipse并对我的项目进行了清理构建,问题解决了!


2
如果您使用的是其他人生成并提供给您的调试密钥,则这就是空地图出现以下异常的原因。
java.io.IOException: Server returned: 3

您可以使用此链接获取API密钥:https://console.developers.google.com/apis/credentials 此链接将带您到谷歌凭据页面,这是获取API密钥的新位置。

你说的调试密钥是指调试密钥库还是地图密钥? - Rami Salim

2

签名地图密钥用于发布应用程序。因此,如果您使用签名地图密钥通过USB共享网络调试应用程序,则会获得此类信息。如果您想要调试应用程序,请切换回调试地图密钥,并在发布更新或新版本之前将其替换为签名地图密钥。


是的,签名的API密钥适用于发布版本。使用此密钥,仅在您从市场安装应用程序后,地图视图才会显示出来。 - Sagar Hatekar
不管你从哪里(市场/游戏,侧载...)获取apk文件都无所谓,重要的是它使用正确的密钥进行签名。 - The incredible Jan

2

我遇到了同样的问题。在我的情况下,我做错了的是这个。我把keytool命令写成了这样:

keytool -list -keystore debug.keystore ...

改为:

keytool -list -keystore ~\.android\debug.keystore ...

所以我没有用我的指纹更新Eclipse的密钥库。

希望这能帮助到某个人 :)


1

我刚遇到了完全相同的问题。

没有用户编写的代码会抛出异常:它在Eclipse logcat中生成,结果是您看不到任何Google地图瓦片。像Jen一样,我重新生成了密钥,但无济于事。

平台是Android 3.2,设备是Asus Transformer,连接是WiFi。

顺便说一下,我的Android 2.2应用程序在Droid上通过3G检索地图运行良好。

这是我的问题的解决方案,希望能帮助Jen:

在我的情况下,如果我使用“Debug as” Eclipse图标将发布版本安装到已连接USB的Transformer上,则地图会失败,如上所述(顺便说一下,这是我在Android 2.2和其他设备上成功使用过多次的过程)。

因此,我尝试了这个方法:我使用Eclipse File | Export ...选项创建一个发布APK,然后使用其Asus Sync应用程序将该APK安装到Transformer上。一切正常。地图瓦片出现了。


你说得对,这不是代码问题。我尝试在不同的应用程序、使用不同的 Gmail 帐户创建密钥,但仍然出现相同的错误。我以为可能是我的设备问题,我使用运行 Anroid 2.3 的 HTC G2,然后我尝试使用不同的 Android API 在模拟器中运行,但也没有成功。我尝试了你的建议,使用 AstroFile 将 APK 安装到我的设备上,但问题仍然存在。谢谢你,听到我不是唯一遇到这个问题的人真是好极了。我能想到的唯一另一个解决方案就是将我的项目移到另一台电脑上并再次尝试。 - Jen
你是否也重新生成了MD5指纹?在我的情况下,MD5发生了变化,因此我不得不获取一个新的Maps API密钥。 - CJ Villa
是的,我已经重新生成了MD5指纹,但仍然出现相同的错误。 - Jen
非常有趣,今天早上我开始出现这些症状。在那之前,代码一直运行良好。我的密钥可能已经过期了吗?我会检查并发布结果。 - tony gil

1

还有一件事: 在添加-v之后,您必须记住Google API只需要MD5而不是SHA1。因此,请检查您向Google提供的代码。


1
那么为什么谷歌会说: 谷歌验证每个请求是否来自于一个与下面列出的证书SHA1指纹和包名匹配的Android应用程序。您可以使用以下命令查找开发人员证书的SHA1指纹。 - IgorGanapolsky

0

我有同样的问题,但我想我找到了答案!

  1. 决定按照这些步骤 https://developers.google.com/android/maps-api-signup 并获取您的证书的MD5指纹
  2. 在开发过程中,如果地图没有显示出来,请不要担心!只需使用第一步中使用的密钥工具,简单提取APK并使用此APK文件安装到您的手机上,您将看到MapView

无论如何,在开发期间,也许您看不到MapView,但这仍然不是问题,不要担心!只需等待完成应用程序并使用您的密钥库构建,您将看到地图正确显示。


0
对于那些尝试从sdk extras构建地图示例的可怜人:一旦我将包名从com.example.mapdemo重命名为com.mynmae.mapdemo,地图就神奇地出现了。是的,我浪费了一个小时搜索和尝试,而它默默地拒绝了包名。

0

我来自未来! 我曾经遇到过完全相同的问题。但这可能是初学者开发者的问题。

当你在Android Studio中创建一个新的Google Maps活动时,google_maps_api.xml文件中有一个链接可以获取API密钥。所以当你跟随这个链接时,谷歌会为你的项目创建一个“调试”密钥。正如Sagar Hatekar所解释的那样,这确实只适用于测试和开发。

更明确地说,谷歌通过SHA-1证书指纹(也在google_maps_api.xml的注释中说明)来识别你的项目。所以我想说的是,与公共API不同,你不能将同一个密钥用于多个项目

https://developers.google.com/maps/documentation/android-sdk/start

在这个链接中,他们有一个小节,讨论了稍微慢一点的方法,可能是为了解释这种现象。
因此,如果您正在为一个不适用的项目使用相同的密钥,请尝试请求一个新的密钥。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接