即使使用正确的API密钥,Android自动完成功能仍被拒绝访问Google Places API请求。

23
我正在尝试制作一个自动完成字段,当用户输入时应获取城市,使用Google Places API,如此教程所述: https://developers.google.com/places/training/autocomplete-android 您可能像我一样多次找到这个问题,但这些答案都没有帮助到我。以下是您需要了解的内容:
URL地址是 https://maps.googleapis.com/maps/api/place/autocomplete/json?sensor=false&key=myKey&components=country:ro&input=whatTheUserTypes 请不要回复说您已经用自己的API密钥替换了它并且可行,因为在那里放置的API密钥必须是特定于Android的,无法从浏览器中使用。
所以我是否使用从密钥库签署应用程序获得的SHA1指纹创建了Android API密钥。 我从控制台打开了Maps和Places API。 配额没有超限。
所有这些仍然使我得到 REQUEST_DENIED。
我没提到的是我已经激活了O2Auth-是否会改变任何事情?难道把API密钥放在应用程序中不是很简单吗?
谢谢!
9个回答

95
虽然已经有答案了,但我认为社区可以做得更好。 之前我为此烦恼不已,这个问题对我来说毫无意义... 我在制作iOS/Android应用程序时,所以我创建了一个iOS/Android密钥... 错误。 使用Google的Places API,你的Bundle Identifier甚至都不会被考虑。 你真正想要做的是这样的: (我使用新的用户界面)
1.登录https://cloud.google.com/console#/project 选择您的项目名称,然后进入API和授权>API
确保你已经开启了Places API。这是Places API工作所需开启的唯一事项。 enter image description here 2.进入凭证 单击公共API访问下的创建新密钥 enter image description here 3.选择浏览器密钥 enter image description here 4.仅单击创建
留空HTTP Refer框。 enter image description here 5.使用在此生成的密钥
这个密钥将允许任何设备的任何用户通过您的开发者登录访问API。 您可以在此处尝试它:(确保用您生成的密钥替换YOUR_KEY_HERE
https://maps.googleapis.com/maps/api/place/autocomplete/json?input=Food%20Sh&sensor=false&radius=500&location=0,0&key=YOUR_KEY_HERE

6. 享受

现在,您可以在您的Android/iOS设备中使用上面的URL。


@Arc的回答让这个答案听起来像是一个“不安全的临时解决方案”,而不是正确的生产技术。但我仍然不确定。在常规Web浏览器中使用的浏览器密钥极易被盗用和重复使用(很容易伪造REFERRER标头)。在Andriod / iOS应用程序中使用的浏览器密钥要难得多-需要查看应用程序二进制文件或对SSL连接进行MIM攻击以访问Google。奇怪的是,谷歌让这一点如此不清楚。 - mpoisot
有点奇怪,但确实有效。我在他们的文档中找不到任何明确的参考。谢谢。 - elbuild
1
真是太棒了...但为什么IOS|Android键无法正常工作? - Siten
4
谢谢!这个方法在2015年对我有效,但自那以后用户界面有所改变。为了让这个方法工作,我不得不在API中启用“Google Places API Web Service”。 - Melly

28

Google Places API目前不支持使用从Google APIs控制台生成的Android或iOS密钥,只支持服务器和浏览器密钥。

如果您想要请求此支持,请提交Places API - 功能请求


再次感谢,这解决了很多问题。文档中有提到吗?在自动完成教程中提到,API密钥“应该”存储在代理服务器上,但这让我们许多人认为我们仍然可以直接从应用程序中使用它。 - Stefan Malacu
在Places API文档中没有提到,但在API控制台帮助中提到:“请注意,某些API仅支持Android密钥”。 - Chris Green
如果我想从我的Web浏览器中进行测试,那么没有机会工作吗? - andilabs
嗨,我有同样的问题,在我的应用程序中需要在AutocompleteView中显示搜索地点,但它给出了“请求被拒绝”的错误。请查看我的问题“http://stackoverflow.com/questions/20017094/android-google-places-api-return-request-denied”。你是如何解决的?请帮帮我。 - M.A.Murali

5

https://developers.google.com/places/training/autocomplete-android

存储API密钥

尽管上面的代码演示了如何在Android应用程序和Places Autocomplete服务之间直接通信,但是您不应该将Places API密钥与您的应用程序一起存储。

因此,您应该构建一个Web应用程序,该应用程序存储您的API密钥并代理Places API服务。为了保护Android应用程序和代理Web服务之间的通信安全,您应该要求用户对您的代理Web服务进行身份验证。您的Android应用程序可以安全地存储用户凭据并将其传递给您的Web服务,或者用户可以通过Android WebView登录到您的Web应用程序。

对于后一种方法,您的Web应用程序应创建并返回用户身份验证令牌以供Android应用程序使用,随后,您的Android应用程序应将此令牌传递给您的代理Web服务。


这与关键安全性有关,而不是解决OP的问题。 - Carlos P
1
这确实回答了问题,一个快速的解决方法是使用浏览器密钥并允许任何引荐来源,但文档中描述的方法才是正确的。 - overlii
这个答案真的应该得到更高的投票。虽然排名最高的答案展示了在设备上直接使用API密钥的解决方法,但Google的建议是不要直接在设备上存储凭据,因为它们很容易被检索。 - markquezada

1
Go to google cloud platform console>Credentials click on edit by selected your YOUR_API_KEY>Application restrictions > select none option>save thats it.
如果您从应用约束中选择android应用程序选项,则谷歌将拒绝使用REQUEST_DENIED的位置API。

0
在 Google Cloud 控制台中输入“Places”并激活它。创建一个 API 密钥,并像通常一样将其插入到您的 Android Studio 应用程序中。就这样。

0
在Google开发者控制台中,你应该能够找到“Places API”和“Places API for Android”两个选项。

dev console search

请确保使用“Android Places API”

由于某些原因,“Android Places API”在API列表中被隐藏,但可以通过搜索访问。


你是说你已经使用SHA1指纹+包名来保护你的Google Places API for Android密钥,并且从你的应用程序直接向API执行调用,但你仍然没有收到Request_Denied吗?我也这样做了,但仍然看到Request_Denied。 - Baker

0

我曾经遇到过同样的问题,我通过离开

接受这些 HTTP 引用者(网站)的请求(可选)

在浏览器密钥中为空来解决它。


0

我还是新手,所以不能发表评论,但为了阐明Moe的答案,我解决了一些类似的Google Maps API问题,涉及URL查询(使用Volley进行方向查询),以下是解决步骤:

  1. 获取Android API密钥(包括我的情况下的Google Maps Directions API)。
  2. 获取“服务器”API密钥(这似乎是通过使用“HTTP引用程序”这些天的密钥限制创建的 - 实际上,它只是用于通过HTTP发出URL查询)。
  3. 将Android API密钥存储为标记在标记中的中,其中和作为您的密钥。这用于直接与Maps API交互(减去URL查询)。
  4. 在发出URL查询时使用服务器API密钥。

我不确定是否也适用于Places API的URL查询,如果您只需要服务器API密钥,或者是否有更好的解决方案,但这对我有效。

我想象它可以仅使用第一个密钥 - 不受Android限制的密钥。


0

我曾经遇到过同样的问题。对我来说,关键是启用项目的计费功能。我仍然在使用“Android应用程序”限制。设置完付款方法后,Places API 开始工作。

在使用 Android 的 Places SDK 之前,请完成以下操作:

  • 按照获取 API 密钥指南获取、添加和限制 API 密钥。
  • 为每个项目启用计费功能。
  • 为每个项目启用 Places API。

请访问这里了解更多信息。

此外,请务必查看 Google Places API 的计费计划,因为它不是免费的!


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