Google Play游戏服务 - 无法登录

时间:2013-05-16 06:57:38

标签: android google-play-services google-play-games

在昨天的Google I / O主题演讲之后,我更新了我的Android SDK,将游戏服务整合到我的某个应用中。

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

  1. 在开发者控制台(游戏服务)中添加并链接了我的应用
  2. 将OAuth客户端ID包含到我的app / manifest
  3. BaseGameActivityGameHelper添加到我的项目(from GitHub
  4. 将google-play-services库添加到我的项目
  5. 已展开BaseGameActivity,添加了com.google.android.gms.common.SignInButton
  6. 我还设置了游戏元数据,当然还有一些成就。开发控制台声明它已准备好发布。为了测试登录流程和成就,我添加了两个Google+帐户作为测试用户。

    但是当我测试SignInButton时,会弹出一个警告:未知错误。这是logcat:

    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应用程序条目(双重检查证书指纹)
    • 禁用反盗版
    • 跳过proguard
    • 创建一个新的(测试)游戏并使用其客户端ID

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

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

    Hartok的解决方案!

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

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

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

    我(正确)关联的应用的新客户端ID看起来像89xxxxxxxx73-2u6mXXXXXXXXXXXXXXXXXXX8903.apps.goo...,而不仅仅是之前的12位数。我终于想通了你必须排除破折号和字母数字的东西,只能使用12位数字。

18 个答案:

答案 0 :(得分:30)

我已经解决了这个问题。

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

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

希望它有所帮助。

答案 1 :(得分:14)

经过长达2周的时间尝试解决这个问题,我已经为我解决了这个问题创建了步骤,并决定与每个遇到同样问题的人分享它,而不是发布游戏。它用于测试。当发布时间到来时,我将分享用于发布应用程序的步骤,并确保它适用于Google Play游戏服务。

请注意,我尝试做的只是使用Google登录按钮登录,而不签名后会发生什么操作,同时请注意我已将Google Play示例中的BaseGameUtils用作库,而我的完成所有这些工作的首选IDE是Eclipse。

以下是使用eclipse的逐步步骤:

1 - 在您的eclipse工作空间中导入BaseGameUtils作为库,确保导入后不会发生错误。如果发生错误,请执行以下操作:

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

b-单击Java构建路径

c-Click从中添加外部jar导航到您的SDK位置并找到Google-Play-services.jar

d-选择它并单击确定---&gt;你应该看到在JAR和类文件夹窗口中添加了jar。

e-转到图书馆右侧的订单和导出标签,确保&#34; Android私人图书馆&#34;和#34; Android Dependencies&#34;检查也确保选中了google-play-services.jar。

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

(重要的是确保hello world和BaseGameUtil都在同一个驱动器中,两个驱动器都不起作用)

右键单击项目浏览器右侧的hello world应用程序

单击Java构建路径

c-点击图书馆

d-如果需要,从外部或内部源(不需要)

添加android support-v4

通过点击添加类文件夹 - &gt;来添加基本游戏工具.jard;然后选择BaseGameUtilProject ---然后选择/ bin文件夹 - 这应该将其导入您的应用程序

如果需要,还可以从外部来源添加google-play-services.jar

g-in&#34;订购和出口&#34;确保您拥有以下选择---&gt;&#34; Android私有库,Android依赖,BasegameUtils.jar,GooglePlayGameServices.jar&#34;以及默认情况下应选择的正常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放在其中

在开发人员控制台中添加此应用程序之前,请先复制您在eclipse IDE上的调试密钥。在eclipse中这样做的过程如下:

单击Window b-选择android c-Click构建 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

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

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

d-运行以下命令

keytool -printcert -file&#34; TempLocation \ Meta-INF \ CERT.RSA&#34;

您将获得MD5以及SHA1和SHA256

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

11-以下是如何从开发人员控制台检查SHA1,

a-去游戏服务

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

c-向下滚动到&#34; API控制台项目&#34;

d-你应该看到&#34;这个游戏链接到名为helloworld&#34;

的API控制台项目 helloworld应该是一个超链接点击它,

这将打开Goog​​le APis控制台

g-在APconsole中点击API Access

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

我 - 确保软件包名称与Android清单中的软件包名称相同,我的意思是提到的所有软件包名称都要确保它与&#34;中的名称相匹配。已安装应用程序的客户端ID&#34; (在我的情况下,它与我的清单第4行中的那个没有匹配)

这就是你现在应该能够使用谷歌游戏服务测试你的登录

答案 2 :(得分:14)

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

在此之前我曾经尝试过使用其中一个或者只使用另一个,但它也没有用。

答案 3 :(得分:5)

Step 3. Generate an OAuth 2.0 client ID中,它特别发出如下警告:

  

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

所以我的经验是你需要虔诚地遵循指南:Setting Up Google Play Game Services with the Google Play Developer Console

答案 4 :(得分:4)

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

所以,一旦你遇到这个问题,最好的解决方案是改变apk包名并创建新的游戏服务 - 这肯定总是有效 - 请注意游戏服务名称 - 不要使用你使用过的名字早些时候 - 它会弄乱一切。

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

答案 5 :(得分:3)

确保您在元数据中输入的ID是您的应用ID,而不是您的客户ID。并且您无法对其进行硬编码,因为它必须是字符串,您必须在资源中指定它,然后在清单中引用它。

阅读本文以获取更多信息:

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

  

注意:对于Android,您无需在其中包含完整的客户端ID   你的应用程序,因为它将自动从   申请ID。

答案 6 :(得分:2)

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

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

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

答案 7 :(得分:1)

感谢Sachin Chavan终于解决了它,问题是:
1.谷歌游戏采取了错误的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 ,经过多次错误之后,解决了它(以粗体显示的阶段)。

答案 8 :(得分:1)

这是一份清单:

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

  4. 虽然文档引用了“ Google Developers Console ”但请不要智能播放,并尝试从那里添加客户端ID。虽然最终客户ID也将在那里结束。有一个很容易被误读的小记:

  5.   

    您必须在 Google Play开发者中创建新的客户ID   控制台,而不是 Google Developers Console

    1. 因此,根据此说明,仅从 Google Play开发者控制台创建您的客户ID,换句话说,通过“添加链接的应用”创建。因此,您通常会创建2个链接的应用程序,一个用于使用'debug.keystore'(使用相同的包,但具有不同的指纹)和另一个'链接应用'用于'生产'密钥库,但使用相同的包,但具有不同的指纹。
    2. 我认为这涵盖了所有人,大多数人可能会发现自己处于陷阱中,因为在 Google Developer Console 中看起来都不错,但事实上,他们可能错过了上面的步骤3和4

答案 9 :(得分:1)

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

答案 10 :(得分:1)

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

有关详细信息,请参阅“{3}}

疑难解答中的”其他原因“一节

答案 11 :(得分:1)

盖伊,您是否正确设置了帐户以进行测试?

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

  

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

这对我来说是缺失的一步。之后我再也没有出现这些错误:

  

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

答案 12 :(得分:0)

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

对我来说,我正在使用一个Sample(按钮Clicker)并将其伪装成我发布的应用程序之一。我可能仍然需要做所有SHA1更改的东西,因为它似乎已经关闭,但是对我有利的更改是将版本ID更新为3,因为示例从1开始,我的真实/已发布应用程序设置为2。

答案 13 :(得分:0)

请试试这个:

  1. 将您的应用注册为测试版(如果尚未发布)(在Google开发者网站上)。
  2. 制作一些测试用户ID并在那里注册。
  3. 现在在那里写你的SHA1 id。
  4. 记下Google生成的开发人员ID。
  5. 将其放在应用中的适当位置。
  6. 如果您已经这样做,那么请遵循这个最重要的步骤。

    6 - 现在使用相同的密钥库导出您的应用,然后将其安装到您的设备中(您已在其中注册为测试者ID,在Google上注册)。
    现在,您肯定会在没有任何错误的情况下访问Google实时服务器。

答案 14 :(得分:0)

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

此外,我偶然发现两个链接和已发布的应用程序指向开发人员控制台中的相同app_ID,这两个应用程序都已发布且无法删除。

答案 15 :(得分:0)

在我的情况下,我忘记在AndroidManifest.xml中更改包名称;这就是全部了。我想应该先检查一下。

答案 16 :(得分:0)

仍然不适合我。谷歌完全重置了我的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/players/me的意外响应代码403 05-22 00:35:58.195:E / Volley(11166):[506] il.a:https://www.googleapis.com/games/v1/players/me的意外响应代码403 05-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):at ajy.a(SourceFile:108) 05-22 00:35:58.205:E / SignInIntentService(11166):at abm.a(SourceFile:213 05-22 00:35:58.205:E / SignInIntentService(11166):at abm.a(SourceFile: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):在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(153​​28):无法登录 - 应用程序没有注册的客户端ID

答案 17 :(得分:0)

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