Android中的谷歌地图签名api密钥错误

Posted

技术标签:

【中文标题】Android中的谷歌地图签名api密钥错误【英文标题】:Google map signed api key errors in Android 【发布时间】:2011-11-09 22:06:30 【问题描述】:

当我从调试映射密钥切换到签名映射密钥时,我的映射停止工作。我在 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)

我已经仔细检查了所有内容,权限和库都已到位。我重新创建了烧焦的钥匙,但没有运气。

有什么想法吗?

【问题讨论】:

贴出抛出异常的代码。 我遇到了同样的问题,它运行了一次,然后每次运行,但只加载了一个灰色网格并出现了与您发布的相同的错误。 你知道你应该接受对你有用的答案:) @SagarHatekar 哈哈,我知道!我一直在这里,显然没有永远登录。 【参考方案1】:

我遇到了同样的问题,我认为互联网上没有任何有用的答案,所以希望这对以后的每个人都有帮助。

使用GoogleMaps for Android 时,您需要两个键 - 调试和释放。

“调试”键是一种误导性术语。当您在 Eclipse 中开发应用程序时,也将使用此密钥。所以本质上,使用调试密钥进行开发、测试和调试。

当您准备好将应用程序启动到 Market 时,在 AndroidManifest.xml 中设置 android:debuggable="false" 并使用签名 API 密钥。

使用签名的 API 密钥时, MapView 仅在从 Android Market 安装应用程序时才会显示。因此,从Eclipse(运行方式、调试方式等)或命令行(adb install) 安装应用程序不会显示MapView。请放心,一旦应用进入市场 - 您下载它,MapView 就会出现。

使用签名的 API 密钥,如果您从 Eclise 部署应用程序,您将收到“服务器返回 3,IOProcessing 异常 26”作为警告 - 忽略它。

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

要获取这两个密钥,请按照Obtaining API keys for GoogleMaps on Android 的步骤操作。

编码愉快!

更新:

上面用于获取 api 密钥的链接现在已被弃用。继续参考Obtaining API keys for GoogleMaps Android API v2。

【讨论】:

我不知道如何为每个应用创建超过 1 个 GMaps API 密钥。 AFAIK,GMaps API 密钥与 .keystore 相关联(您使用它来签署您的应用程序)。这意味着对于每个应用,您只能创建 1 个 GMaps API 密钥。 嗯..你有一个有效的观点。也许您会生成多个签名密钥?虽然我不确定签名是否是唯一的。 准确地说:“当使用签名的 API 密钥时,只有在从 Android Market 安装应用程序时,MapView 才会显示。因此,从 Eclipse 安装应用程序(运行方式,调试方式“ - 这不是真的正确。事实上,如果应用程序使用您在申请 Maps 密钥时提供给 Google 的密钥进行签名,则 MapView 将按预期工作。你可以从命令行安装,如果你用这个签名它就可以工作。 我对这个问题感到困惑......我们为我们的客户准备了一张工作地图,但无论是从市场还是从其他来源安装,它都能正常工作。有一天,我们意识到它不再起作用了。确实,我们不得不更改我们的签名证书,我们错过了再次将其提供给谷歌...... @Sagar 你是说我们在调试模式下看不到 MapView 了吗?【参考方案2】:

终于解决了。

我使用的是 Windows 机器,所以我只是去了 C:\Users\rohit\.android 并删除了 debug.keystoredefault.keyset1 完成后,我去了 Eclipse 并为我的项目应用了一个干净的构建并完成了!

【讨论】:

【参考方案3】:

签名的地图密钥用于发布应用程序。所以你会得到这样的信息。如果您通过带有签名映射密钥的 USB 连接调试应用程序。如果要调试应用程序,请切换回调试映射密钥,并在发布更新或新版本之前将其替换为签名的映射密钥。

【讨论】:

是的,签名的 API 密钥用于发布。使用此键,地图视图将仅在您从市场安装时显示。 从哪里(市场/游戏,侧载...)获得 apk 并不重要。重要的是它使用正确的密钥签名。【参考方案4】:

我遇到了同样的问题。就我而言,我做错的是这个。我正在编写这样的 keytool 命令:

keytool -list -keystore debug.keystore ...

代替:

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

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

我希望这对某人有帮助:)

【讨论】:

【参考方案5】:

如果您使用的是其他人生成并提供给您的调试密钥,这就是空白地图的原因,但有以下异常。

java.io.IOException: Server returned: 3

您可以使用此链接获取 API 密钥:https://console.developers.google.com/apis/credentials

此链接将带您进入 google 凭据页面,这是获取 API 密钥的新位置。

【讨论】:

调试键是什么意思?调试密钥库还是映射密钥?【参考方案6】:

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

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

平台为Android 3.2,设备为华硕Transformer,连接方式为WiFi。

仅供参考,我的 Android 2.2 应用程序运行良好,可以通过 3G 在 Droid 上检索地图。

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

在我的情况下,如果我使用“Debug as”Eclipse 图标将发布版本安装到 Transformer 上,并且 Transformer USB-tethered,地图将如上所述失败(仅供参考,这是我已经成功使用过很多次的过程次使用 Android 2.2 和其他设备)。

所以我尝试了这个:我使用 Eclipse File|Export... 选项创建一个发布 APK,然后使用其 Asus Sync 应用程序将该 APK 安装到 Transformer 上。一切顺利。地图图块出现。

【讨论】:

你说得对,这不是代码问题。我尝试在不同的应用程序、不同的 gmail 帐户下创建密钥,但仍然出现相同的错误。我想可能是我的设备,一台运行 Anroid 2.3 的 HTC G2,然后我尝试使用具有不同 Android api 的模拟器,但也没有运气。我尝试了您的建议并使用 AstroFile 将 apk 安装到我的设备上,但问题仍然存在。不过谢谢你,很高兴听到我不是唯一一个遇到这个错误的人。我唯一能想到的另一件事是将我的项目移到另一台计算机上并重试。 您是否也重新生成了 MD5 指纹?就我而言,MD5 发生了变化,所以我必须获得一个新的 Maps API 密钥。 是的,我确实重新生成了 MD5 指纹,但仍然是同样的错误。 非常有趣,我今天早上开始出现这些症状。在那之前,代码运行良好。我的密钥可能过期了吗?将检查并发布。【参考方案7】:

还有一件事: 添加 -v 后,你必须记住,谷歌 API 只需要 MD5 而不是 SHA1。所以请检查你给谷歌的代码。

【讨论】:

那么为什么 Google 会说:Google 会验证每个请求是否来自与下面列出的证书 SHA1 指纹和包名称之一匹配的 Android 应用程序。您可以使用以下命令发现您的开发者证书的 SHA1 指纹【参考方案8】:

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

    决定按照这些步骤https://developers.google.com/android/maps-api-signup 接收您证书的 MD5 指纹 在开发过程中,如果地图没有显示,不要担心这个!简单解压APK使用android工具和第一步使用的关键工具,并使用这个APK文件安装到你的手机上,你会看到MapView

不管怎样,在开发的时候,也许你没有看到 MapView,但它不是问题,不用担心这个!完成应用程序并使用您的密钥库构建后只需等待,您将看到正确的地图显示

【讨论】:

【参考方案9】:

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

【讨论】:

【参考方案10】:

我来自未来!我也遇到过同样的问题。但这对于新手开发者来说可能是个问题。

当您在 android studio 中创建新的 google maps 活动时,有一个链接可让您在 google_maps_api.xml 文件中获取 API 密钥。因此,当您点击此链接时,Google 将为您的项目创建一个“调试”密钥。正如 Sagar Hatekar 解释的那样,这确实只用于测试和开发。

更清楚地说,谷歌通过SHA-1 certificate fingerprint 识别您的项目(也在google_maps_api.xml 的cmets 中说明) 所以我想说的是,您不能对多个项目使用相同的密钥,这与现有的开放/公共 API 不同。

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

在这个链接中,他们有一小部分的主题是速度稍慢的方法,这可能是解释这种现象的一种尝试。

因此,如果您在项目中使用相同的密钥,但该密钥并不适用,请尝试申请新密钥。

【讨论】:

以上是关于Android中的谷歌地图签名api密钥错误的主要内容,如果未能解决你的问题,请参考以下文章

我的谷歌地图 api 密钥在 python 中不起作用,尽管它可以在 swift 中运行

使用没有API密钥的谷歌地图?

使用特定城市的谷歌地图 API 获取自动完成的地址

Android:Google Map v2 未显示发布 apk 的地图

用于 Flutter iOS Swift 设置的谷歌地图

当我对谷歌地图中的 API 密钥使用应用程序限制或 API 限制时,其他人可以运行我的 android 应用程序吗?