【问题标题】:Why is my api key not accepted by the Google Directions (Android) request?为什么 Google 路线 (Android) 请求不接受我的 api 密钥?
【发布时间】:2014-08-22 00:07:32
【问题描述】:

每当我将我的 Google Play 服务 API 密钥连同我的 Google 路线请求一起包含在下面的代码中时:

    private String makeDirectionsURL(double originLat, double originLong, double destLat, double destLong)
{
    StringBuilder url = new StringBuilder();
    //first part of url//
    url.append("https://maps.googleapis.com/maps/api/directions/json?");
    //start adding parameters//
    //origin coordinates
    url.append("origin="+originLat+","+originLong);
    //destiniation coordinates
    url.append("&destination=");
    url.append(destLat+","+destLong);
    //api key
    url.append("&key=");
    url.append(getResources().getString(R.string.google_api_key));
    //NOTE: for some reason, the request suceeds when leaving out the api key 

    return url.toString();

}

当我在请求中包含 api 密钥作为参数时,json 响应显示我的请求已被拒绝。回复如下:

{ "error_message" : "此 IP、站点或移动应用程序无权使用此 API 密钥。", “路线”:[], “状态”:“REQUEST_DENIED” }

但同样的 api 密钥适用于我的 google 地图视图 - 我的 api 控制台注册了地图视图配额限制的访问。更奇怪的是,当我在 Directions 请求中省略 key 参数时,我得到了一个有效的 JSON 响应。

我觉得我必须为 Google 路线服务生成另一个不同的 api 密钥 - 但我不知道该怎么做。这里的文档: https://developers.google.com/maps/documentation/directions/#api_key

说要访问控制台并激活 Directions API 服务 - 我做到了。 然后它说我的 api 密钥“将在 API 访问页面的简单 API 访问部分可用。路线 API 应用程序使用服务器应用程序的密钥。”现在是我感到困惑的地方 - 如果我从移动设备访问,我如何使用服务器应用程序的密钥 - 我假设这适用于任何希望使用该服务的网页 - 但是我该怎么做一个 android应用程序。正如我所说,我已经尝试将我的简单 API 访问密钥用于 Android 应用程序,我知道它可以工作,但是当我将相同的密钥传递给 Google 方向时 - 它神秘地不起作用......

非常感谢任何帮助、模糊的指导或阅读链接。

PS:如果我无法解决这个问题 - 我是否可以在没有 api 密钥的情况下继续发送请求?

【问题讨论】:

  • 我还想指出,错误消息表明 API 密钥被识别为 API 密钥 - 它只是没有被识别为链接到我的应用程序。我通过更改删除部分我的 api 密钥字符串资源和 响应时间更改为说它不是有效的 api 密钥来测试这一点。
  • 这里对此问题的回应:stackoverflow.com/questions/47799745/…

标签: android google-maps-android-api-2


【解决方案1】:

我认为问题在于您试图传递与服务器 IP 地址直接相关的 server key,而您应该传递 android app key

在您的 Google API 控制台中,导航至 API's and Auth。您可以在此处创建新的公共 API 密钥。

出现提示时,选择 Android 应用程序

您需要输入设备的 SHA1 证书指纹

这来自用于签署 apk 的密钥库。在调试中运行应用程序时,您很可能会使用 IDE 的调试密钥库。 Google 有一个很好的 write up 来说明如何获取这些信息。

发布应用时,您需要使用自己的密钥对其进行签名。您需要将 API 密钥编辑为新的密钥库 SHA1 指纹,或者创建一个新的 API 密钥。

另外,根据Google,您应该使用密钥。

All Directions API 应用程序应使用 API 密钥。包括一把钥匙 在您的要求中:

  • 允许您在 API 中监控应用程序的 API 使用情况
  • 控制台。启用每个密钥而不是每个 IP 地址的配额限制。
  • 确保 Google 可以在必要时就您的申请与您联系。

虽然我无法评论他们执行此操作的严格程度,但我强烈建议您这样做以避免将来出现任何问题。

【讨论】:

  • 感谢您的回复,但我已经在使用我的 Android 应用程序密钥 - 与我用来验证 MapView 的密钥相同。我将尝试为具有相同 SHA1:package 名称组合的密钥创建另一个密钥,并将其分别用于我的 Google 路线请求。也许每个 api 服务都需要一个单独的 api 密钥?编辑:它没有工作......
  • @bw15 你有没有发现问题?我遇到了同样的问题(尝试通过适用于 Maps v2 的 API 密钥使用)。
  • 对于遇到这种情况的任何人,关键是不要使用您的 Android 密钥。您必须在 Google Developers Console 中创建一个服务器密钥(在您创建 Android 密钥的同一位置)。该密钥也可用于其他几个 Google API。
  • @MikeCole 我遇到了同样的问题(Android 密钥适用于 Masp、Places API,但不适用于 Directions),我将尝试创建服务器密钥。但是我们这里有个问题,不是吗?如果使用服务器密钥,系统会提示我们指定发送请求的网站的 URL 模式。如果我们在 Android 上使用此密钥,我们将无法指定任何引荐来源网址限制。这是一个必要的权衡吗?它是否会对我们应用的安全性构成威胁?
  • 它确实与服务器密钥一起工作。它写在这里developers.google.com/maps/documentation/directions/… 应该使用服务器密钥。如果没有推荐人的限制可以使用,我还是不明白
猜你喜欢
  • 1970-01-01
  • 2017-10-18
  • 2012-06-28
  • 1970-01-01
  • 2020-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-19
相关资源
最近更新 更多