61

在昨天的 Google I/O 主题演讲之后,我更新了我的 Android SDK 以将游戏服务集成到我的一个应用程序中。

到目前为止我做过的事情:

  1. 在开发控制台(游戏服务)中添加并链接了我的应用程序
  2. 将 OAuth 客户端 ID 包含到我的应用程序/清单中
  3. 添加BaseGameActivityGameHelper我的项目(来自 GitHub
  4. 将 google-play-services 库添加到我的项目中
  5. 扩展BaseGameActivity,添加了一个com.google.android.gms.common.SignInButton

我还设置了游戏元数据,当然还有一些成就。开发控制台声明它已准备好发布。为了测试登录流程和成就,我添加了两个 Google+ 帐户作为测试用户。

但是当我测试 SignInButton 时,会弹出一个警报:Unknown error。这是日志猫:

ERROR/Volley: il.a: Unexpected response code 403 for https://www.googleapis.com/games/v1/players/me
ERROR/SignInIntentService: Access Not Configured
ERROR/LoadSelfFragment: Unable to sign in - application does not have a registered client ID

我已经在生产模式下构建了我的应用程序 - 使用 ProGuard 和正确的证书。

我错过了什么?

更新 - 更多尝试

以下是关于我在此期间尝试过的内容的简短概述。没有任何帮助。

  • 删除并重新创建链接的 Android 应用程序条目(双重检查证书指纹)
  • 禁用反盗版
  • 跳过保护
  • 创建一个新的(测试)游戏并使用它的客户端 ID

该问题与测试部分的帐户无关。使用未启用测试的帐户将导致另一个错误消息:

E/GameAgent: Unable to retrieve 1P application 547xxxxxx457 from network
E/CheckGameplayAcl: Unable to load metadata for game

Hartok 的解决方案!

Hartok 的解决方案帮助我解决了这个问题。我以前从未访问过Google API 控制台。重要的是要知道,当您从游戏中删除链接的应用程序甚至删除游戏(在开发控制台中)时,不会删除 OAuth 客户端 ID。您必须访问 API 控制台并手动将其删除。

自动选择的 SHA1 指纹(总是)错误!您必须查找自己的:

keytool -exportcert -alias <your-alias> -keystore <path-to-keystore> -list -v

我(正确)链接的应用程序的新客户端 ID 看起来像89xxxxxxxx73-2u6mXXXXXXXXXXXXXXXXXXX8903.apps.goo...,而不是像以前那样只有 12 位数字。我终于发现你必须排除破折号和字母数字的东西,并且只能使用 12 位数字。

4

18 回答 18

30

我已经解决了这个问题。

就我而言,当我将我的应用程序(尚未发布)链接到我的 Google Play 游戏服务项目时,Google Play 自动选择的证书指纹并不是一个好的指纹。

为了解决这个问题,我在Google APIs Console上删除了我的应用程序客户端 ID ,取消了我的应用程序的链接,然后使用正确的证书指纹重新链接它。在 Eclipse 中导出应用程序时会显示此指纹(如果您的 ADT 插件是最新的)。

希望能帮助到你。

于 2013-05-17T04:22:10.523 回答
14

有同样的问题。我的解决方案是在 Dev Console 中链接同一个包两次,第一次使用我自己证书中的 SHA1 指纹,第二次使用我的调试密钥 SHA1。

在此之前,我曾尝试仅使用一个或仅使用另一个,但两者都不起作用。

于 2013-06-06T19:37:37.800 回答
14

经过漫长的 2 周尝试解决此问题后,我为我创建了解决此问题的步骤,并决定与遇到相同问题的每个人分享它,而无需发布游戏。它用于测试。当发布时间到来时,我将分享用于发布应用程序的步骤,并确保它可以与 Google play 游戏服务一起使用。

请注意,我所要做的只是使用 Google 登录按钮登录,而无需对签名后应该发生的事情进行任何操作,还请注意,我已使用 Google play 示例中的 BaseGameUtils 作为库,以及我选择的 IDE完成所有这些工作的是 Eclipse。

以下是使用eclipse的步骤:

1-将 BaseGameUtils 作为库导入 Eclipse 工作空间,确保导入后不会出现错误。如果发生错误,请执行以下操作:

a- 在项目资源管理器中右键单击 BaseGameUtil 项目

b-单击 Java 构建路径

c-单击添加外部 jar 从那里导航到您的 SDK 位置并找到 Google-Play-services.jar

d-选择它并单击确定 ---> 您应该会在 JAR 和类文件夹窗口中看到添加的 jar。

e-转到库右侧的“订购和导出”选项卡,确保选中“Android 私有库”和“Android 依赖项”,同时确保选择了 google-play-services.jar。

2-现在确保在您要使用的应用程序中正确引用您导入的 BaseGameUtility,“您可以创建一个简单的 hello world 应用程序来测试它”,所以现在我们将在 hello world 应用程序中引用 BaseGameUtility,如下所示:

(重要的是确保 hello world 和 BaseGameUtil 都在同一个驱动器中,两个驱动器将无法工作)

a-右键单击项目资源管理器右侧的 hello world 应用程序

b-单击 Java 构建路径

c-单击库

d- 如果需要,从外部或内部源添加 android support-v4(不需要)

e- 通过单击添加类文件夹添加基本游戏 utils .jard --> 然后选择 BaseGameUtilProject ---然后选择 /bin 文件夹 -- 这应该将其导入您的应用程序

如果需要,也可以从外部源 f-add google-play-services.jar

g-in "order and export" 确保您选择了以下 --->"Android Private Libraries,Androiddependancies ,BasegameUtils.jar,GooglePlayGameServices.jar" 以及默认情况下应选择的正常 SRC 和 GEN。

3- 现在在您的 java 文件 helloworld.java 中确保您的主屏幕具有所有必需的导入,然后扩展 BaseGameUtil 并确保项目实现 ViewOnClickListener。

4- 编辑您的 android 清单以包含以下内容:

 <meta-data android:name="com.google.android.gms.games.APP_ID"
        android:value="@string/app_id" />

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

5- 确保您的资源中有一个 ids.xml 文件,以便在创建后包含您的应用程序 ID。

<string name="app_id"></string>

您现在可以将其留空,因为稍后您必须将应用程序 ID 放入其中

6 在开发人员控制台中添加此应用程序之前,复制您在 Eclipse IDE 上的调试密钥。在 Eclipse 中这样做会发生如下情况:

a-单击窗口 b- 选择 android c-单击构建 d- 复制 SHA1 指纹并保留它以在开发人员控制台中创建应用程序时使用它。

7- 在开发者控制台中创建您的游戏并使用从第 6 步检索到的 SHA1。

8- 将应用程序 ID 放在第 5 步中突出显示的 ids.xml 中

9-仔细检查您的值并确保开发人员控制台和清单文件之间的包名称都是正确的。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
**package="com.helloword.check"**
android:versionCode="1"
android:versionName="1.0" >

10- 完成后,确保开发人员控制台中的应用程序与使用 keytool 在开发人员控制台中分配的 SHA1 匹配。这是我花了 2 周时间才弄清楚的步骤

a- 从 hello world 项目的 bin 文件夹中找到您的应用程序 APK,然后将其复制到另一个位置,以便稍后使用密钥工具检查其 ID

b-找到您的 keytool --> 通常位于计算机的 JAVA 文件夹下,在我的情况下,它位于 C:\Program Files\Java\jdk1.7.0_09\jre\bin

c- 在临时位置提取您的 apk

d-运行以下命令

keytool -printcert -file "TempLocation\Meta-INF\CERT.RSA"

您将获得 MD5 以及 SHA1 和 SHA256

确保 SHA1 与开发人员控制台中的相匹配。

11-这是从开发人员控制台检查您的 SHA1 的方法,

a- 去游戏服务

b- 在我们的例子中单击游戏名称 helloWorld

c- 向下滚动到“API 控制台项目”

d- 你应该看到“这个游戏链接到名为 helloworld 的 API 控制台项目”

e- helloworld 应该是一个超链接点击它,

f- 这将打开 Google API 控制台

g- 在 APconsole 中点击 API Access

h- 向下滚动到“已安装应用程序的客户端 ID”,您应该会看到 SHA1,确保它与前面步骤 10 中从 keytool 生成的相同。(如果它们不匹配,您必须从开发者控制台中删除游戏并使用正确的 SHA1 重新创建它)“确保不要从 Google API 控制台更改 SHA1,这将导致问题。

我 - 确保包名称与您的 android 清单中的包名称相同,我的意思是在提到包名称的所有地方都确保它与“已安装应用程序的客户端 ID”中的名称匹配(在我的情况下,它与我的清单的第 4 行)

就是这样,您现在应该可以使用 google play 游戏服务测试您的登录了

于 2013-08-31T17:43:56.463 回答
5

步骤 3.Generate an OAuth 2.0 client ID中,它特别给出如下警告:

警告:请勿直接打开 Google API 控制台并在该页面上手动添加您的客户端 ID。当您向游戏服务发送请求时,这样做可能会导致错误。

所以我的经验是您需要认真地遵循指南:使用 Google Play 开发者控制台设置 Google Play 游戏服务

于 2013-05-28T12:26:06.917 回答
4

我经常和这个问题作斗争。Google API 控制台中的更改只会破坏 OAuth 客户端 ID - 不要触摸它。对我来说唯一的解决方案是创建新的游戏服务并使用普通(非调试)密钥连接签名的 apk - 因为一旦您使用任何密钥添加 apk,如果您再次尝试使用不同的密钥添加它,它将无法正常工作。删除游戏不行,google还是会记住包名的。您可以尝试更改 apk 包名称(当然这不是最好的主意)然后再试一次,但这并不总是有效。

因此,一旦您遇到此问题,最好的解决方案是更改 apk 包名称并创建新的游戏服务 - 这肯定总是有效 - 请注意游戏服务名称 - 不要使用您之前使用的名称 - 它会搞砸一切。

从我使用此服务遇到的几个问题中,最有趣的是我现在将我的 apk 与游戏服务连接,但它未在其中列出,并且由于错误而无法添加它:此客户端 ID 是全局唯一的,并且已在使用中- 我认为客户端 ID 不是 OAuth ID - 我无法删除它 - 没有这样的选项 - 也许这是我们在这里得到的根本问题。

于 2013-06-02T21:33:59.330 回答
3

确保您在元数据中输入的 ID 是您的应用 ID,而不是您的客户端 ID。而且你不能硬编码它,因为它必须是一个字符串,你必须在你的资源中指定它,然后在你的清单中引用它。

阅读本文了解更多信息:

https://developers.google.com/games/services/console/enabling#c_specify_client_id_settings

注意:对于 Android,您不需要在应用程序中包含完整的客户端 ID,因为它将自动从应用程序 ID 派生。

于 2013-05-16T16:47:16.653 回答
2

我遇到了类似的问题,我看到此页面已于 2013 年 5 月 30 日更新:

https://developers.google.com/games/services/android/troubleshooting

它可能对我们中的一些人有所帮助。

于 2013-06-02T23:41:24.997 回答
1

伙计,您是否正确设置了测试帐户?

请参阅https://developers.google.com/games/services/console/testpub#enabling_accounts_for_testing

如果您的游戏处于未发布状态,您必须将要授予访问权限以进行测试的用户帐户列入白名单。否则,您的测试人员在尝试访问游戏服务端点时会遇到 OAuth 和 404 错误。

这对我来说是缺少的一步。之后我不再收到这些错误:

E/GameAgent:无法从网络检索 1P 应用程序 547xxxxxx457
E/CheckGameplayAcl:无法加载游戏的元数据

于 2013-05-17T07:23:41.350 回答
1

对我有用的技巧是发布游戏服务配置,因为我已经发布了一个用于 alpha 测试的 APK。

有关更多详细信息,请参阅故障排除中的“其他原因”段落https://developers.google.com/games/services/android/troubleshooting

于 2013-06-23T12:16:21.133 回答
1

Hartok 的方法也对我有所帮助,但是“您可能需要从 google api 控制台中删除项目。” 这听起来足够了,但它不是,至少对我来说不是。Google 在 API 控制台中几乎没有“取消删除”功能。您可以简单地恢复所有内容,这意味着它们存储您的 SHA-1 密钥,但标记为已删除(?)。对我再次使用调试密钥(也被阻止)有用的是,我取消删除了所有测试项目,并从所有已删除的项目中手动删除了“API 访问”选项中的所有 OAuth 密钥,之后我可以使用我的调试密钥再次。希望对某人有所帮助...

于 2013-08-24T11:31:39.147 回答
1

这是一个清单:

  1. 首先检查您是否没有在https://developers.google.com/games/services/android/troubleshooting上描述过任何愚蠢的错误或不匹配
  2. 一个常见的问题是冲突的“app_id”资源 id,例如,如果您使用 Facebook SDK,它可能使用同名的密钥,因此请仔细检查并重命名其他密钥,以防发现冲突。(我会保留分配给该项目的“app_id”,因为 BaseGameUtils 库在我检查的一些源代码中将其称为“ app_id ”)。

  3. 尽管文档提到了“谷歌开发者控制台”,但并不聪明,而是尝试从那里添加客户端 ID。虽然,最后,客户 ID 也将在那里结束。有一个很容易被误读的小注释:

您必须在Google Play Developer Console中创建新的客户端 ID ,而不是在Google Developers Console中。

  1. 因此,根据此说明,仅从Google Play 开发者控制台创建您的客户端 ID ,换句话说,通过“添加链接的应用程序”。因此,您通常会创建 2 个链接应用程序,一个用于使用“debug.keystore”(使用相同的包,但具有不同的指纹),另一个“链接应用程序”用于“生产”密钥库,但使用相同的包,但使用不同的指纹。

我认为这涵盖了所有内容,大多数人可能会发现自己陷入了陷阱,因为在Google Developer Console中看起来一切都很好,但实际上,他们可能已经错过了上面的第3 步和第 4 步

于 2014-10-28T14:36:47.817 回答
1

感谢Sachin Chavan 终于解决了,问题是:
1. Google play 拿错了sha1。
2. 尝试从 Google Developer Console 添加它 - 没有用。
查看 Sachin Chavan 的帖子和链接后,我发现您可以多次从 Google Play 控制台链接同一个应用程序,因此我使用了别名 SHA1:

keytool -exportcert \
-alias <your-key-name> \
-keystore <path-to-production-keystore> \
-list -v

和调试 SHA1:

keytool -exportcert \
-alias androiddebugkey \
-keystore <path-to-debug-keystore> \
-list -v

我又将应用程序链接了两次,第一次输入别名 SHA1,第二次输入调试 SHA1,经过一天的大量错误,解决了它(粗体阶段)。

于 2015-05-16T15:33:05.090 回答
0

仍然不适合我。Google 完全重置了我的 Google Play 游戏服务,并逐步进行了集成。仍然说我没有注册的谷歌客户端 ID。相当失败,考虑 3 年制作 Google Play 游戏服务。

最后一件事,@googlemail.com 的账号不被识别,你不能导出成就的ID(你需要复制过去的html,当你有40个成就时,这很痛苦)。

05-22 00:35:57.914: I/dqi(11166): 处理请求时捕获 I/O 异常 (org.apache.http.NoHttpResponseException): 目标服务器未能响应 05-22 00:35:57.914: I /dqi(11166): 重试请求 05-22 00:35:58.135: E/Volley(11166): [506] il.a: https://www.googleapis.com/games/v1/ 的意外响应代码 403玩家/我 05-22 00:35:58.195: E/Volley(11166): [506] il.a: https://www.googleapis.com/games/v1/players/me 05-的意外响应代码 403- 22 00:35:58.205:E/SignInIntentService(11166):未配置访问 05-22 00:35:58.205:E/SignInIntentService(11166):aol 05-22 00:35:58.205:E/SignInIntentService(11166):在 ajy.a(SourceFile:108) 05-22 00:35:58.205: E/SignInIntentService(11166): 在 abm.a(SourceFile:213 05-22 00:35:58.205: E/SignInIntentService(11166): 在abm.a(源文件:194)05-22 00:35:58.205:E/SignInIntentService(11166): at aav.a(SourceFile:486) 05-22 00:35:58.205: E/SignInIntentService(11166): at aqu.a(SourceFile:221) 05-22 00:35:58.205: E/SignInIntentService(11166): at com.google.android.gms.games.service.GamesSignInIntentService.onHandleIntent(SourceFile:343) 05-22 00:35:58.205: E/SignInIntentService(11166): at android.app.IntentService $ServiceHandler.handleMessage(IntentService.java:65) 05-22 00:35:58.205: E/SignInIntentService(11166): 在 android.os.Handler.dispatchMessage(Handler.java:99) 05-22 00:35:58.205 : E/SignInIntentService(11166): 在 android.os.Looper.loop(Looper.java:137) 05-22 00:35:58.205: E/SignInIntentService(11166): 在 android.os.HandlerThread.run(HandlerThread. java:60) 05-22 00:35:58.205: E/LoadSelfFragment(15328): 无法登录 - 应用程序没有注册的客户端 ID无法登录 - 应用程序没有注册的客户端 ID
于 2013-05-22T04:42:33.133 回答
0

就我而言,我忘记在 AndroidManifest.xml 中更改包名称;这就是全部了。我认为这应该首先检查。

于 2013-05-30T06:17:25.517 回答
0

请试试这个:

  1. 将您的应用注册为测试(如果尚未发布)(在 Google 开发者网站上)。
  2. 制作一些测试用户 ID 并在那里注册。
  3. 现在在那里写下你的 SHA1 id。
  4. 记下 Google 生成的开发者 ID。
  5. 将其放在您的应用程序中的适当位置。

如果您已经这样做了,那么请遵循这个最重要的步骤。

6 - 现在使用相同的密钥库导出您的应用程序,然后将其安装在您的设备中(您已在其中登录为测试人员 ID,在 Google 上注册)。
现在,您肯定会毫无错误地访问 Google 实时服务器。

于 2013-06-15T13:59:53.197 回答
0

版本号!我不得不将我的版本 ID 更改为大于我最近版本的值。突然可以登录了!

对我来说,我使用了一个示例(按钮点击器)并将其伪装成我发布的应用程序之一。我可能仍然需要进行所有 SHA1 更改,因为它似乎已关闭,但对我有利的更改是将版本 id 更新为 3,因为示例从 1 开始,而我的真实/发布的应用程序设置为 2。

于 2013-06-30T13:22:43.147 回答
0

对我来说,调试签名有效,但未签名;/我们可以就此联系谷歌吗?我花了一整天的时间;/我得到“没有与此客户端 ID 关联的链接应用程序”,但它们都在正确的项目下的 Google Api 中。

此外,我不小心有两个链接和发布的应用程序指向开发者控制台中的同一个 app_ID,它们都已发布且无法删除。

于 2013-08-28T20:08:52.153 回答
0

请在应用程序运行时检查互联网连接。如果您未连接,则会记录此错误消息。

于 2015-03-22T03:54:50.703 回答