Google Play游戏服务 – 无法login

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

我迄今为止所做的事情:

  1. 添加和链接我的应用程序在开发控制台(游戏服务)
  2. 包括OAuth客户端ID到我的应用程序/清单
  3. 添加BaseGameActivityGameHelper到我的项目( 从GitHub )
  4. 添加谷歌播放服务库到我的项目
  5. 扩展了BaseGameActivity ,增加了一个com.google.android.gms.common.SignInButton

我也设置了游戏元数据,当然还有一些成就。 开发者控制台声明它准备发布。 为了testingloginstream量和成就,我添加了两个Google+帐号作为testing用户。

但是当我testingSignInButton时,popup一个警告: 未知的错误 。 这是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 

我在生产模式下构build了我的应用程序 – 使用ProGuard和正确的证书。

我错过了什么?

更新 – 更多的尝试

以下是我在此期间尝试过的一个简短的概述。 没有帮助。

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

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

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

哈托克的解决scheme!

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

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

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

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

感谢您帮助我!

我已经解决了这个问题。

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

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

希望它有帮助。

经过漫长而痛苦的2个星期,我试图解决这个问题,我已经为我解决这个问题创造了一些步骤,并决定与每一个遭受同样问题的人分享,而不是发布游戏。 它用于testing。 当发布时间到来,我将分享用于发布应用程序的步骤,并确保它与Google Play游戏服务一起使用。

请注意,我所要做的就是使用Googleloginbuttonlogin,而不必采取任何行动,以便在login后会发生什么情况,同时请注意,我已经使用Google Play示例中的BaseGameUtils作为库,以及我select的IDE要完成这一切是Eclipse。

下面是使用eclipse逐一的步骤:

1,导入BaseGameUtils作为你的eclipse工作空间中的一个库,确保导入后没有错误发生。 如果发生错误,请执行以下操作:

在项目浏览器中右键单击BaseGameUtil项目

b-点击Java构buildpath

c-点击从那里添加外部jar子导航到您的SDK位置,并findGoogle-Play-services.jar

dselect它,然后单击确定—>您应该看到在JAR和类文件夹窗口中添加的jar。

e转至图书馆右侧的订单和导出标签,并确保选中“Android私有图书馆”和“Android依赖”,并确保选中google-play-services.jar。

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

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

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

b单击Java构buildpath

c – 点击库

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

通过点击添加类文件夹 – >然后selectBaseGameUtilProject – 然后select/ bin文件夹 – 这应该将其导入到您的应用程序

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

g-in“order and export”确保您有以下select – >“Android专用库,Android依赖项,BasegameUtils.jar,GooglePlayGameServices.jar”以及默认应select的正常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文件,以便在创build它之后包含您的应用程序ID。

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

您可以暂时将其留空,以后您将不得不放置应用程序ID

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

a在窗口上单击b-selectandroid c-Click构buildd-复制SHA1指纹,并在开发人员控制台中创build应用程序时保留它以使用它。

7-在开发人员控制台中创build您的游戏,并使用从步骤6中检索到的SHA1。

将应用程序ID放置在步骤5中突出显示的ids.xml中

仔细检查你的值,确保包名称在开发者控制台和清单文件之间都是正确的。

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

10-完成后,请确保开发人员控制台中的appolication与使用keytool在开发人员控制台中分配的SHA1匹配。 这是我花了两个星期才弄明白的一步

从您的hellow世界项目的bin文件夹中find您的应用程序APK,并将其复制到另一个位置,以便稍后使用关键工具检查其ID

b-locate你的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-点击我们的例子hellowWorld中的游戏名称

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

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

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

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

g-在APconsole中点击API Access

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

我确保在你的Android清单中包名是相同的包名称,我的意思是无处不在包名称确保它匹配“客户端ID为已安装的应用程序”(在我的情况下,它不匹配的行我的舱单4)

这就是你现在应该能够使用谷歌游戏服务来testing你的login

有同样的问题。 我的解决scheme是在开发控制台连接两次相同的软件包,第一次使用我自己的证书中的SHA1指纹,第二次使用我的debugging密钥SHA1。

在此之前,我尝试过使用一个或者只是另一个,而且两者都没有工作。

在第3步中,生成一个OAuth 2.0客户端ID ,具体给出如下警告:

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

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

我很反对这个问题。 Google API控制台中的更改只会打破OAuth客户端ID,请勿触摸它。 对我来说,唯一的解决scheme是创build新的游戏服务,并将已签名的apk与正常(而不是debugging)密钥进行连接 – 因为一旦你添加了任何密钥的apk,如果你将再次尝试添加不同的密钥,它将无法正常工作。 删除游戏将不起作用,谷歌仍然会记住包名称。 你可以尝试改变apk包的名称(当然这不是最好的主意),然后再试一次,但并不总是奏效。

所以一旦你遇到这个问题,最好的解决办法就是改变apk包的名字,并且创build新的游戏服务 – 这个肯定总是有效的,请注意游戏服务的名字 – 不要用你以前用过的名字来制作它 – 会搞砸了一切

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

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

阅读更多信息:

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

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

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

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

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

盖伊,你有没有正确设置你的帐户进行testing?

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

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

这对我来说是缺less的一步。 之后,我再也没有得到这些错误:

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

这个技巧对我来说就是发布游戏服务configuration,因为我已经有一个APK发布了alphatesting。

有关更多详细信息,请参阅https://developers.google.com/games/services/android/troubleshooting中的; “其他原因”一节

哈托克的方法帮助我,但是“你可能需要从谷歌API控制台删除项目”。 这听起来足够了,但这不是,至less不适合我。 Google在API控制台中几乎没有“取消删除”function。 您可以简单地恢复所有内容,这意味着它们存储您的SHA-1密钥,但标记为已删除(?)。 什么对我再次使用debugging密钥,也是被阻止的是,我删除了所有我的testing项目,并手动删除所有这些删除的项目“API访问”选项中的所有OAuth密钥,之后,我可以使用我的debugging密钥再次。 希望能帮助别人…

这是一个清单:

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

  3. 尽pipe文档提到“ Google开发者控制台 ”并不聪明,并尝试从那里添加客户端ID。 尽pipe最后,客户ID也将在那里结束。 有一个小问题很容易被误读:

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

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

我认为这涵盖了所有,大多数人可能会陷入陷阱,因为在Google Developer Console中一切都很好,但事实上,他们可能已经错过了上面的步骤3和步骤4

谢谢沙文终于解决了,问题是:
1. Google玩错了sha1。
试图从谷歌开发者控制台添加它 – 没有工作。
看过Sachin Chavan的post和链接之后,我看到你可以多次从Google Play控制台连接相同的应用,所以我把别名SHA1与:

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

和debuggingSHA1:

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

我再次链接了应用程序两次,第一次input别名SHA1,第二次debuggingSHA1 ,在大量错误发生之后,解决了这个问题(阶段粗体)。

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

最后一点,@ googlemail.com帐户无法被识别,你不能导出成就的ID(你需要复制过去的HTML,当你有40个成就,这是一个相当痛苦)。

05-22 00:35:57.914:I / dqi(11166):处理请求时捕获I / Oexception(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的意外回应代码403 05- E / SignInIntentService(11166):访问未configuration05-22 00:35:58.205:E / SignInIntentService(11166):aol 05-22 00:35:58.205:E / SignInIntentService(11166) (来源文件: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(来源文件:221)05-22 00:35:58.205:E / SignInInten tService(11166):在com.google.android.gms.game.gsers.GamesSignInIntentService.onHandleIntent(SourceFile:343)05-22 00:35:58.205:E / SignInIntentService(11166):在android.app.IntentService $ ServiceHandler (Handle.java:99)05-22 00:35:58.205:E / SignInIntentService(11166):at android.os.Looper.loop(Looper.java:137)05-22 00:35:58.205:E / SignInIntentService(11166):at android.os.HandlerThread.run(HandlerThread.java: 60)05-22 00:35:58.205:E / LoadSelfFragment(153​​28):无法login – 应用程序没有注册的客户端ID

在我的情况下,我忘了更改AndroidManifest.xml中的包名称; 就这些。 我认为这应该首先检查。

请试试这个:

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

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

6 – 现在将您的应用程序导出到相同的密钥存储中,然后将其安装到您的设备中(您已经在其中login了testing人员ID,在Google上注册)。
现在肯定你会访问谷歌实时服务器没有任何错误。

版本ID! 我不得不将我的版本ID更改为比我最近的版本更大的值。 突然间我可以login了!

对我来说,我正在使用一个示例(button点击),并伪装成我的发布应用程序之一。 我可能仍然必须做所有的SHA1改变的东西,因为它似乎是closures的,但我倾向于更改版本ID更新为3,因为示例从1开始,我的真实/发布的应用程序被设置为2。

对我来说,debugging签名工作,签署不了; /我们可以联系谷歌关于这个? 我花了一整天的时间; /我得到“没有关联的应用程序与此客户端ID相关联”,但他们都在正确的项目下的谷歌API。

另外我不小心有两个链接和发布的应用程序指向相同的app_ID在开发者控制台,都发布,不能被删除。

请在应用运行时检查互联网连接。 如果您没有连接,则会logging此错误消息。