在昨天的Google I/O主题演讲之后,我更新了我的Android SDK,将游戏服务集成到我的一个应用程序中.
到目前为止我做的事情:
BaseGameActivity和GameHelper我的项目(从GitHub)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
Run Code Online (Sandbox Code Playgroud)
我已经在生产模式下构建了我的应用程序 - 使用ProGuard和正确的证书.
我错过了什么?
这里是我在此期间尝试过的简短概述.什么都没有帮助.
该问题与测试部分的帐户无关.使用未启用测试的帐户将导致另一条错误消息:
E/GameAgent: Unable to retrieve 1P application 547xxxxxx457 from network
E/CheckGameplayAcl: Unable to load metadata …Run Code Online (Sandbox Code Playgroud) 我正在使用Android Play Games - Real Time Multiplayer我的应用程序.当我创建一个新房间时,回调onRoomCreated()返回STATUS_NETWORK_ERROR_NO_DATA5%的时间.我不知道为什么我偶然发现这个错误.
某些帖子建议应在创建新帖子之前关闭.我总是在super.onstop()打电话之前离开我的房间.我也在onLeftRoom()创建一个新房间之前等待回调.
堆栈跟踪
02-20 22:57:07.208: I/libjingle(1763): Token type:OAuth2
02-20 22:57:07.208: I/libjingle(1763): Final XMPP server hostname talk.google.com port to 5222
02-20 22:57:07.316: I/libjingle(1763): OpenSSLAdapter::OnConnectEvent
02-20 22:57:07.416: I/libjingle(1763): BeginSSL: talk.google.com
02-20 22:57:07.476: W/libjingle(1763): Warning(openssladapter.cc:388): ContinueSSL -- error -1
02-20 22:57:07.480: W/libjingle(1763): Warning(openssladapter.cc:397): OpenSSLAdapter::Error(ContinueSSL, -1)
02-20 22:57:07.504: I/libjingle(1763): SSL Cleanup
02-20 22:57:07.532: I/libjingle(1763): Token type:OAuth2
02-20 22:57:07.532: I/libjingle(1763): Final XMPP server hostname talk.google.com port to 5222
02-20 …Run Code Online (Sandbox Code Playgroud) 谷歌提供BaseGameUtils图书馆,并建议我们扩展它BaseGameActivity.但是,该课程使游戏在游戏开始时自动登录.如果玩家不想或不能连接到他的Google帐户,那么在游戏开始时这可能非常耗时.
所以我不想要这个功能.相反,我想提供一个登录按钮.只有当他点击该按钮时才能连接播放器.从那时起,每次玩家开始游戏时,他都会自动连接到他的Google帐户,而无需点击任何按钮.我怎样才能做到这一点?
我希望让所有连接的玩家都能玩游戏.我可以获得谷歌+圈子中的玩家,但我希望玩家获得所有用户.我无法找到我需要做什么许可才能做到这一点.
我正在使用此代码来获取玩家,但它总是返回0.
PendingResult<LoadPlayersResult> players = Games.Players.loadConnectedPlayers(mGoogleApiClient, false);
players.setResultCallback(new ResultCallback<Players.LoadPlayersResult>()
{
@Override
public void onResult(LoadPlayersResult result)
{
PlayerBuffer buf = result.getPlayers();
Toast.makeText(getApplicationContext(), "players"+buf.getCount(), Toast.LENGTH_SHORT).show();
}
});
Run Code Online (Sandbox Code Playgroud) 我正在使用Google Play服务开发Android游戏,以创建基于回合的匹配.
起初一切都很好,我为登录用户加载了turnbased匹配
Games.TurnBasedMultiplayer.loadMatchesByStatus(getApiClient(),
new int[]{TurnBasedMatch.MATCH_TURN_STATUS_MY_TURN,
TurnBasedMatch.MATCH_TURN_STATUS_THEIR_TURN,
TurnBasedMatch.MATCH_TURN_STATUS_INVITED,
TurnBasedMatch.MATCH_TURN_STATUS_COMPLETE})
.setResultCallback(this);
Run Code Online (Sandbox Code Playgroud)
它总是加载任何给定状态的所有匹配.但是从上周末开始调用回调但是没有匹配,因为我没有参与任何匹配(状态响应没问题).我在手机上删除了Google Play服务的缓存,然后重新启动了设备.在那一刻,所有比赛再次显示,直到我下次打开应用程序.所有比赛都失踪了.一旦我开始新的比赛,比赛将继续显示上述方法(刷新列表),直到我关闭应用程序.在下一次发布时,比赛也消失了.
我不得不说游戏尚未发布,但在Google Play开发者控制台的测试阶段.我在模拟器上发现了同样的问题.它运行好几天但突然遇到了与我的真实设备相同的问题(后来的构建因此不是单个代码更改导致这一点).
有没有其他人注意到这种行为或有关于如何解决它的想法?
可能与多个应用程序连接到一个游戏有关?我有两个连接调试证书签名的应用程序,今天下午为签名的apk添加了一个.当我使用签名的apk时,它再次起作用,直到我部署了一个新的测试应用程序(debug signed).切换回签名的apk后,错误仍然存在.
由于似乎没有人知道答案让我重新解释这个问题.我应该自己在设备上缓存TurnBasedMatches吗?我刚刚删除了播放服务缓存并重新打开了我的应用程序.结果?数百个游戏的列表(因为我每次测试时都必须开始一个新游戏...)
我的代码来处理loadMatchesResult
@Override
public void onResult(TurnBasedMultiplayer.LoadMatchesResult loadMatchesResult)
{
showToast("GotMatches status: " + loadMatchesResult.getStatus().getStatusCode());
//add matches to listview (only caching matchId, no references to turnbasedmatch)
loadMatchesResult.getMatches().getMyTurnMatches().close();
loadMatchesResult.getMatches().getInvitations().close();
loadMatchesResult.getMatches().getTheirTurnMatches().close();
loadMatchesResult.getMatches().getCompletedMatches().close();
loadMatchesResult.release();
}
Run Code Online (Sandbox Code Playgroud)
找到另一个兴趣点..它开始看起来像在设备上部署新的apk时出现的问题...一旦我部署新的apk(通过从谷歌播放安装alpha版本或从Android Studio直接调试版本)匹配消失了.当我不更改apk时,我可以重新启动手机/关闭应用程序,它工作正常...
如果我通过Play商店更新应用程序也会出现问题......应该有更多人遇到此问题!
关注这篇文章:http://android-developers.blogspot.com/2016/01/play-games-permissions-are-changing-in.html我已经获得了一个使用授权代码,可以在我的后端服务器上使用,如下所示:
import com.google.android.gms.games.Games;
//later
Games.GetServerAuthCodeResult result = Games.getGamesServerAuthCode(gameHelper.getApiClient(), server_client_id).await();
if (result.getStatus().isSuccess()) {
String authCode = result.getCode();
// Send code to server...
Run Code Online (Sandbox Code Playgroud)
这似乎工作正常,但它提出了一个问题:
1)getGamesServerAuthCode和GetServerAuthCodeResult被标记为已弃用.为什么?我应该使用其他东西吗?
2)如何在非Android安装的Java应用程序中执行相同的操作?我能够在客户端应用程序上获取令牌,但我还需要获取一个使用代码以传递到我的后端服务器,如上所述.我找不到相同的函数来获取服务器验证码.(使用com.google.api.client.extensions.java6.auth.oauth2)
我基本上试图遵循这个流程:https://developers.google.com/games/services/web/serverlogin但是用Java,而不是Javascript.我试图在Android应用程序和桌面Java应用程序中执行此操作.
Gradle Sync错误出现在我的build.gradle文件中,我导入的模块名为BaseGameUtils,The minSdk version should not be declared in the android manifest file.我说我根本就没有看到这个,我也不在Android Manifest中?
但这里是我的build.gradle文件.请帮忙!
我正在使用谷歌的新游戏服务测试我的游戏,我想重置我的帐户的成就以进行测试.
我发现你可以使用谷歌的API(https://developers.google.com/games/services/management/api/#Achievements)重置成就,我正在使用OAuth 2.0游乐场发送POST请求,但是它不工作:(
具体来说,我是发送POST请求" https://www.googleapis.com/games/v1management/achievements/reset ",详见该链接.
并且,当我转到code.google com并检查我的服务时,所有Play服务都是"开启".
这是输出.如何重置我的成就以进行测试?我甚至关闭了吗?显然我的"访问没有配置"我该怎么做?如果不授予我的访问权限,OAuth2.0游乐场的前两个步骤的重点是什么?
HTTP/1.1 403 Forbidden
Content-length: 205
X-xss-protection: 1; mode=block
X-content-type-options: nosniff
X-google-cache-control: remote-fetch
-content-encoding: gzip
Server: GSE
Reason: Forbidden
Via: HTTP/1.1 GWA
Cache-control: private, max-age=0
Date: Sun, 19 May 2013 04:11:38 GMT
X-frame-options: SAMEORIGIN
Content-type: application/json; charset=UTF-8
Expires: Sun, 19 May 2013 04:11:38 GMT
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "accessNotConfigured",
"message": "Access Not Configured"
}
],
"code": 403,
"message": "Access Not Configured"
}
}
Run Code Online (Sandbox Code Playgroud) achievements oauth2-playground google-play-services google-play-games
我刚开始使用Google Play游戏服务,昨天在检查logcat时我无法注意到这个错误:
E/DataBuffer(3183):检测到DataBuffer对象内部数据泄漏!确保在完成所有DataBuffer扩展对象后显式调用close().(内部对象:com.google.android.gms.common.data.DataHolder@40555410)
它连续发生几次.我不完全确定它为什么会出现.它不会使我的应用程序崩溃,也不会使谷歌成就/排行榜功能停止工作.
我所知道的是它与"unlockAchievementImmediate"和"submitScoreImmediate"功能有关.
有没有人遇到此问题或有任何建议?
编辑:在我的应用程序中,我只使用"unlockAchievementImmediate"和"submitScoreImmediate".这些函数不返回任何需要关闭的缓冲区.
我最近在我的Android应用中引入了Google TagManager,以便将更改推送到app config,而无需重新部署应用.
但我得到的例子是:
java.lang.IllegalStateException: Results have already been set
at com.google.android.gms.common.internal.p.a(Unknown Source)
at com.google.android.gms.common.api.b$a.a(Unknown Source)
at com.google.android.gms.tagmanager.ed.a(Unknown Source)
at com.google.android.gms.tagmanager.ed.a(Unknown Source)
at com.google.android.gms.tagmanager.ed$b.a(Unknown Source)
at com.google.android.gms.tagmanager.ed$b.a(Unknown Source)
at com.google.android.gms.tagmanager.cj.c(Unknown Source)
at com.google.android.gms.tagmanager.ck.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587)
at java.lang.Thread.run(Thread.java:841)
Run Code Online (Sandbox Code Playgroud)
它们出现在Android 4.4到5.0.1的各种设备上
正如您所看到的,堆栈跟踪中没有我的应用程序的元素,我真的不知所措,我可以做什么(除了删除TagManager)以避免或减轻错误.
我找到了与GooglePlus登录相关的同一错误消息的一个引用,因此我认为它可能与Google Play服务库有关.
有人看过吗?有任何想法吗?
引发了Play-Games项目的问题:https: //code.google.com/p/play-games-platform/issues/detail?id = 209
android google-play-services google-tag-manager google-play-games
android ×9
java ×2
achievements ×1
libjingle ×1
memory-leaks ×1
multiplayer ×1
oauth ×1
oauth-2.0 ×1
xml ×1