谷歌游戏服务-无法登录

60

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

我所做的事情:

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

我还设置了游戏元数据和一些成就。开发者控制台显示已准备好发布。为了测试登录流程和成就,我添加了两个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控制台。需要知道的是,当您从游戏中删除链接的应用程序甚至删除一个游戏(在开发者控制台中)时,OAuth客户端ID不会被删除。您需要访问APIs控制台并手动删除它。

自动选择的SHA1指纹永远是错误的!你必须查找你自己的:

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

我已经将我的应用程序与正确的客户端ID关联起来,但新的客户端ID看起来像 89xxxxxxxx73-2u6mXXXXXXXXXXXXXXXXXXX8903.apps.goo...,不再只有12个数字了。我最终发现,您必须排除破折号和字母数字内容,并且只能使用这12个数字。


1
奇怪的事情:我遇到了同样的问题(我不是devconsole的管理员用户),但当管理员尝试时,它可以正常工作,没有任何问题。 - jhbruhn
1
我这边也有同样的管理员问题。 - Hartok
3
别忘了在你的设备上删除Google Play服务应用程序的缓存和内容。这个问题曾经让我困扰了大约一个小时。 - you786
我需要创建2个关联的应用程序吗? - Tocco
抱歉...但是我在Google开发者控制台中有两个指纹,但只有发布版本的一个有效...有什么建议吗?TIA - Tocco
18个回答

30

我已经解决了这个问题。

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

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

希望这有所帮助。


1
我按照您的指示对debug.keystore进行了操作,它可以正常工作,但是当我使用我的生产keystore进行相同的操作时却无法正常工作。必须发布游戏以便使用生产指纹进行测试吗? - PaNaVTEC
我认为SHA1代码对我的应用程序也被错误地自动选择了。你是如何成功创建另一个oath2客户端ID的? - Habba
只需在Google APIs控制台中删除它并取消链接您的游戏Google Play Dev控制台。 然后,重新将游戏服务与您的游戏链接,将创建一个新的OAuth客户端。 - Hartok
7
抱歉,您如何“在Google Play Dev控制台中取消关联游戏”?我没有看到任何在控制台中执行此操作的按钮。请问该怎么做? - bobygerm
1
我已经发布了我的游戏。还有希望让它正常工作吗?我在这里发布了详细的LogCat输出链接 - principal-ideal-domain
@bobygerm 我也很想知道。我可以删除应用程序并重新添加,但无法提供新的Sha1指纹。不过这似乎并不重要,我的调试指纹应该始终保持不变。 - Madmenyo

14
经过长达两个星期的尝试和修复,我创建了一些解决此问题的步骤,并决定与所有遇到同样问题的人分享。这仅用于测试,不涉及发布游戏。在发布时,我将分享用于发布应用程序并确保使用谷歌玩游戏服务的步骤。
请注意,我所尝试的只是使用 Google 登录按钮登录,而没有对登录后应该发生什么采取任何操作。另请注意,我使用的是谷歌播放示例中的 BaseGameUtils 库,并且我选择的 IDE 是 Eclipse。
以下是使用 Eclipse 的一步步操作:
1. 在 Eclipse 工作区中导入 BaseGameUtils 作为库,请确保导入后没有出现错误。如果出现错误,请执行以下操作:
a. 在项目资源管理器中右键单击 BaseGameUtil 项目。 b. 单击“Java 构建路径”。 c. 从中添加外部 jar 文件,导航到 SDK 位置并找到 Google-Play-services.jar。 d. 选择它并单击“确定”--->您应该看到添加在 JAR 和类文件夹窗口中。 e. 转到“顺序和导出”选项卡,在右侧的库旁边,确保选中“Android 私有库”和“Android 依赖项”,并确保选择了 google-play-services.jar。
2. 现在确保您在要使用的应用程序中正确引用导入的 BaseGameUtility,“您可以创建一个简单的 HelloWorld 应用程序来测试这一点”,因此现在我们将如下引用 HelloWorld 应用程序中的 BaseGameUtility:
(重要的是确保 HelloWorld 和 BaseGameUtil 都在同一个驱动器中,两个驱动器不起作用)
a. 在项目资源管理器的右侧单击 HelloWorld 应用程序。 b. 单击“Java 构建路径”。 c. 点击“库”。 d. 如果需要,从外部或内部源添加 Android 支持-v4(不需要)。 e. 通过单击“添加类文件夹”-->然后选择 BaseGameUtilProject-->然后选择 /bin 文件夹将 base game utils .jard 添加到应用程序中。 f. 如果需要,请从外部源添加 google-play-services.jar。 g. 在“顺序和导出”中确保已选择以下内容--->“Android 私有库、Android 依赖项、BasegameUtils.jar、GooglePlayGameServices.jar”,以及默认情况下应选择的 SRC 和 GEN。
3. 现在,在你的 Java 文件 helloworld.java 中,确保你的主屏幕具有所有所需的 import,并扩展 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- 确保在创建应用程序ID后,资源文件中有一个ids.xml文件来包含它。

<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值匹配。 这是让我花费了两周时间才弄清楚的步骤

a- 在hello world项目的bin文件夹中找到您的应用程序APK,并将其复制到另一个位置以稍后使用keytool检查其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与开发人员控制台中的SHA1匹配。

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

a-进入游戏服务

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

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

d-您应该看到“此游戏已链接到名为helloworld的API控制台项目”

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

f-这将打开Google APis控制台

g-在APconsole中单击API访问

h-向下滚动至“已安装应用程序的客户端ID”,您应该看到SHA1,请确保它与步骤10中先前使用keytool生成的SHA1相同。 (如果不匹配,则必须从开发人员控制台中删除游戏,并使用正确的SHA1重新创建它)“请确保不更改Google APIs控制台中的SHA1,否则会出现问题。

i-确保包名称与Android清单中的包名称相同,我的意思是在包名称被提及的任何地方,请确保它与“已安装应用程序的客户端ID”中的名称匹配(在我的情况下,它与我的清单第4行中的名称不匹配)

这就是了,您现在应该能够使用Google Play游戏服务测试您的登录了。


3
谢谢您详细的解释。我有点生气了,因为仍然有很多开发者在使用Google Play服务时遇到问题。 - ottel142
2
没问题,我同意你的看法,文档并不是很清晰,最多只能算是部分。我找不到一页包含所有内容的页面,一直看到的都是嵌套链接的页面,让人感到非常混乱。我仍在努力测试与 Google Play 服务相关的所有内容,并将继续在此帖子中发布任何更新。 - Dulli
这个答案是迄今为止最好的游戏服务教程。 - Alp

14

我曾经遇到过相同的问题。我的解决方案是在开发控制台中两次链接相同的软件包,第一次使用我的自己证书的SHA1指纹,第二次使用我的调试密钥SHA1。

在此之前,我尝试过仅使用其中一个或只使用另一个,但都没有成功。


2
这也是我的解决方法。但有一个复杂情况:在添加第二个链接应用程序并使用调试密钥后,我们的调试构建仍无法登录(403错误等)。我认为这是因为Google Play服务缓存了无效凭据,可能是在我添加调试证书版本之前的登录失败,或者是使用生产证书的先前构建中的登录。解决方法是通过应用程序设置清除Google Play服务的数据和缓存。 - mwk
@mwk,哇,谢谢!那花了我很长时间。我删除了缓存和数据,然后卸载了我的应用程序,这样它才会“忘记”有关错误证书的信息。 - you786
2
你如何为关联应用设置SHA1密钥?我只知道应用和身份验证凭据页面可以设置SHA1密钥(在链接中,您需要将your-app-id替换为您的应用程序ID)。但由于应用程序ID对于您的游戏是全局的,我不知道如何区分不同的关联应用。 - principal-ideal-domain

5

这就是我的问题所在。谢谢Sachin! - Khan

4
我曾经遇到这个问题很多次。在Google APIs控制台中的更改只会破坏OAuth客户端ID,不要触碰它。对我来说唯一的解决方案是创建新的游戏服务并将签名的apk与常规(非调试)密钥连接 - 因为一旦您使用任何密钥添加apk,如果您再尝试使用不同的密钥添加它,它将无法工作。删除游戏不起作用,谷歌仍将记住包名称。您可以尝试更改apk包名称(当然不是最好的想法),然后重试,但它并不总是有效。

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

从我遇到的这个服务中的一些问题中,最有趣的是我现在将我的apk连接到游戏服务,但它未列出,因此我无法添加它,因为出现错误:此客户端ID在全球范围内是唯一的,并且已经在使用中-我认为客户端ID不是OAuth ID-我不能删除它-没有这样的选项-也许这是我们遇到的根本问题。


1
我想我遇到了同样的问题。有任何消息吗? - berlindev
此客户端ID是全局唯一的,已经在使用中。解决方案在这里:https://code.google.com/p/google-plus-platform/issues/detail?id=554 - Finnboy11

3
请确保您在元数据中输入的ID是您的应用程序ID,而不是客户端ID。您不能将其硬编码,因为它必须是一个字符串,您必须在资源中指定它,然后在清单中引用它。
阅读此文以获取更多信息:

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

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

谢谢,但这正是我包含ID的方式。 - ottel142
@alex,应用程序ID是什么?它是包名吗? - Dittimon
1
嗨@Dittimon,app_id是一个12位数字(我想它是12位,不太记得了)。当您在游戏服务入口中授权应用程序时,它会自动生成。它的形式为123456789123.apps.googleusercontent.com。您只需将123456789123部分放入您的应用程序资源中即可。 - Alex Cabrera

2

1
感谢Sachin Chavan,最终解决了问题,问题如下:
1. Google Play使用了错误的SHA1。
2. 尝试从Google开发者控制台添加它-没有成功。
在查看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,在经历了一天的错误后,这解决了问题(加粗的步骤)。

1
先生,您是否正确设置了测试帐户?请参考https://developers.google.com/games/services/console/testpub#enabling_accounts_for_testing

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

这是我所缺少的步骤。之后,我就不再遇到那些错误了:

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


你确定你把它添加到了正确的位置吗?因为在开发者控制台中有两个定义测试账户的位置:一个是在开发者控制台参数中(错误的位置),另一个是在游戏排名步骤之后(正确的位置)。无论如何,这对我起作用了,也可能会帮助一些人;-) - avianey

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

  3. 尽管文档提到'Google Developers Console',但不要聪明地尝试从那里添加客户端ID。虽然最终客户端ID也会出现在那里。有一个很容易被误读的小注释:

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

根据这个提示,只能从Google Play开发者控制台创建您的客户端ID,换句话说,通过“添加关联应用程序”进行。因此,通常会创建2个关联应用程序,一个用于使用“debug.keystore”(使用相同的包,但具有不同的指纹),另一个“关联应用程序”用于“生产”密钥库,但使用相同的包,但具有不同的指纹。
我认为这涵盖了所有内容,大多数人可能会陷入困境,因为在Google开发者控制台中一切看起来都很好,但实际上,他们可能错过了上述的第3步和第4步

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