即使使用正确的 API 密钥,Android 自动完成的 Google Places API 请求也会被拒绝
Posted
技术标签:
【中文标题】即使使用正确的 API 密钥,Android 自动完成的 Google Places API 请求也会被拒绝【英文标题】:Google Places API request denied for Android autocomplete, even with the right api key 【发布时间】:2013-01-17 06:21:14 【问题描述】:我正在尝试使用本教程中描述的 Google Places API 创建一个自动完成字段,该字段应在用户键入时获取城市: https://developers.google.com/places/training/autocomplete-android
您之前可能和我一样多次发现这个问题,但没有一个答案对我有帮助。以下是你应该知道的事情:
网址是 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 and Places API。 未超过配额。
所有这些,它仍然给我 REQUEST_DENIED
我没有提到的是我激活了 O2Auth - 这会改变什么吗?不应该是把API key放到app里那么简单吗?
谢谢!
【问题讨论】:
【参考方案1】:虽然已经回答了这个问题,但我认为社区可以做得更好。
我对此感到非常恼火,这对我来说毫无意义。我正在制作一个 ios/Android 应用程序,所以我制作了一个 iOS/Android 密钥... 错误。
使用 Google 的 Places API,甚至不会考虑您的包标识符。
你真正想做的是: (我正在使用新的用户界面)
1.登录https://cloud.google.com/console#/project
选择您的项目名称,然后进入 API's & Auth > APIs
确保您已开启 Places API。这是唯一需要打开 Places-API 才能工作的东西。
2。进入凭据
点击 Public API Access 下的 CREATE NEW KEY
3.选择浏览器密钥
4.点击创建,别无其他
将 HTTP 引用框留空。
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 应用程序中使用的浏览器密钥更难窃取 - 梳理应用程序二进制文件或 MIM 攻击对与谷歌的 SSL 连接。奇怪的是,谷歌把这件事说得这么不清楚。 有点奇怪,但它确实有效。我在他们的文档中找不到任何明确的参考。谢谢。 Kya Baat Hai...但是为什么 IOS|Android 键不能正常工作? 谢谢!这在 2015 年对我有用,但自此答案以来用户界面发生了一些变化。我必须在 API 下启用“Google Places API Web 服务”才能正常工作。【参考方案2】:Google Places API 目前不支持从 Google API 控制台生成的 Android 或 iOS 密钥。目前仅支持服务器和浏览器键。
如果您想请求此支持,请提交Places API - Feature Request。
【讨论】:
再次感谢,这为这个问题提供了很多启示 它是否在文档中的某处提到过?它在 Autocomplete 教程中说 API 密钥“应该”存储在代理服务器上,但这让我们中的许多人认为我们可以直接从应用程序中使用它。 Places API 文档中没有提到它,但是在 APIs console help 中提到了它:“请注意,Android 密钥仅受某些 API 支持”。 如果我只想从我的网络浏览器测试它,没有机会工作怎么办? 嗨,我有同样的问题,在我的应用程序中需要在 AutocompleteView 中显示搜索位置,但它给出了“请求被拒绝”。请看我的问题“***.com/questions/20017094/…”。你怎么解决的?。请帮帮我。【参考方案3】:https://developers.google.com/places/training/autocomplete-android
存储您的 API 密钥
虽然上面的代码演示了如何直接通信 在 Android 应用程序和 Places Autocomplete 服务之间,您应该 不要将您的 Places API 密钥与您的应用一起存储。
因此,您应该构建一个 Web 应用程序来存储您的 API 密钥 并代理 Places API 服务。为了保证通讯安全 在您的 Android 应用程序和代理网络服务之间,您应该要求 对您的代理 Web 服务的用户身份验证。您的 Android 应用可以 安全地存储用户凭据并将其传递给您的 Web 服务,或者 用户可以通过 Android WebView 登录到您的网络应用。
对于后一种方法,您的网络应用应创建并返回用户 您的 Android 应用程序的身份验证令牌,您的 Android 应用程序应该 随后将此令牌传递给您的代理网络服务。
【讨论】:
这与密钥安全有关,而不是解决 OP 的问题 这确实回答了这个问题,快速解决方法是不使用浏览器密钥并允许任何引用,但方法描述文档是要走的路。 这个答案真的应该被投票得更高。尽管评分最高的答案显示了直接在设备上使用 API 密钥的解决方法,但 Google 的建议是不要将凭据直接存储在设备上,因为它们很容易检索。【参考方案4】:转到谷歌云平台控制台>凭据点击编辑,选择您的YOUR_API_KEY>应用限制 >选择无 strong> 选项>保存就是这样。
如果您从 应用程序限制 中选择 android 应用程序 选项,那么 google 会拒绝位置 API,但会出现异常 REQUEST_DENIED。
【讨论】:
【参考方案5】:在 Google 开发控制台中,您应该能够找到“Places API”和“Places API for Android”
确保使用“Places API for Android”
由于某种原因,“Places API for Android”隐藏在 API 列表中,但可以使用搜索访问。
【讨论】:
您是说您已经使用 SHA1 指纹 + 包名称保护了您的 Google Places API for Android 密钥,并且正在执行从您的应用到 API 的直接调用,而您是 没有得到Request_Denied?我已经这样做了,但仍然看到 Request_Denied。【参考方案6】:我有同样的问题,我通过离开来解决它
接受来自这些 HTTP 引荐来源网址(网站)的请求(可选)
在浏览器键中为空
【讨论】:
【参考方案7】:我还是新手,所以我无法发表评论,但为了阐明 Moe 的回答,我通过以下步骤解决了一些类似的关于 URL 查询(用于方向,使用 Volley)的 Google Maps API 问题:
-
获取 Android API 密钥(在我的例子中包括 Google Maps Directions API)。
获取“服务器”API 密钥(这似乎是通过使用“HTTP 引用者”的密钥限制来创建的 - 实际上,它只是用于通过 HTTP 发出 URL 查询)。
将Android API 密钥作为
application
标记中的AndroidManifest.xml
中的meta-data
标记存储,android:name="com.google.android.maps.v2.API_KEY"
和android:value
作为您的密钥。这用于与 Maps API 的直接交互(减去 URL 查询)。
在发出 URL 查询时使用服务器 API 密钥。
我不确定这是否也适用于 Places API 的 URL 查询,您是否只需要服务器 API 密钥,或者是否有更好的解决方案,但这对我有用。
我想它只适用于第一个键 - 不限于 Android。
【讨论】:
【参考方案8】:在 Google Cloud Console 中输入 Places 并激活它。像往常一样创建一个 API 密钥并将其插入到您的 Android Studio 应用程序中。就是这样。
【讨论】:
【参考方案9】:我遇到了同样的问题。对我来说,关键是启用项目计费。我仍在使用“Android 应用程序”限制。设置付款方式后,Places Api 开始工作。
在使用 Places SDK for Android 之前,请执行以下操作:
按照获取 API 密钥指南获取、添加和限制 API 密钥。 为您的每个项目启用结算功能。 为您的每个项目启用 Places API。
看there。
请务必查看 Google Places API 的计费计划,因为它不是免费的!
【讨论】:
以上是关于即使使用正确的 API 密钥,Android 自动完成的 Google Places API 请求也会被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
Android:自动选择调试/发布Maps v2 api密钥?
限制对 Google API 的 Android 密钥的使用
在 Android Studio 中使用 Gradle 管理 Google Maps API 密钥