如何确保我始终获得新的 Google 游戏播放器 ID 而不是旧版 ID?



当我的应用处于 alpha 阶段且未发布时,每当用户登录 google Play 游戏时,我都会得到他们的 IDGames.Players.getCurrentPlayer(mGoogleApiClient).getPlayerId(),它会返回这种格式的 ID

G07610263060548408114

但是,现在我处于公开测试阶段,使用相同的调用会给我一个这种格式的 ID

117053902313732480537

(我并不是说从 alpha 到 beta 的进展或我发布的导致了这一点,但那是我开始注意到变化的时候。

通过阅读 github 上的 Unity 插件项目中的一些问题, 原生Android Google+用户ID与使用Unity Plugin #1277及其引用的问题不同,似乎我现在得到的ID的第二个版本是链接到用户的Google Plus帐户的过时版本。新版本(带有前缀g)应该是可用的,因此玩家不需要拥有Google plus帐户即可玩我的游戏。有关替换 id 的谷歌公告,请参阅此帖子。听起来 unity 插件返回新 id,而原生 android 库则没有。

所以我的问题是,为什么在最新版本的 google Play 游戏服务 (10.2.1) 中,我为用户获得的 id 是旧 ID?我怎样才能获得新版本 - 与比赛中的参与者ID相同的版本?

我尝试在 API 中使用谷歌的新登录,但这也给了我旧 ID。即使对于在我获得新 id 格式之前的用户。

我可以在任何地方使用这个遗留 id,它至少是一致的,但是我从中得到的唯一 id turnBasedMatch.getParticipants.get(0).getPlayerId() 是新的 ID,所以我永远无法映射两者。我想使用新 ID,但无法再为新用户获取它。

我的活动记录当前扩展了基本游戏活动 这是我在尝试新登录之前用于初始化客户端的一些代码

mPresenter = GameSetupPresenter.getInstance(getApiClient()); getApiClient().registerConnectionCallbacks(mPresenter); getApiClient().registerConnectionFailedListener(mPresenter);

@Override public void onSignInSucceeded() { Games.Players.getCurrentPlayer(mPresenter.getGoogleApiClient()).getPlayerId(); }

我获取 playerId 的这一行要么返回旧格式的 id,要么返回新格式的 id。

使用新的登录过程,我的代码如下所示:

GoogleSignInOptions options = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
.requestId()
.requestIdToken(getString(R.string.server_client_id))
.requestProfile()
.requestScopes(new Scope(Scopes.GAMES), new Scope(Scopes.PROFILE), new Scope(Scopes.PLUS_ME))
.requestServerAuthCode(getString(R.string.server_client_id), false)
.build();
mPresenter = GameSetupPresenter.getInstance(null);
GoogleApiClient client = new GoogleApiClient.Builder(this)
.enableAutoManage(this, mPresenter)
.addApi(Auth.GOOGLE_SIGN_IN_API, options)
.addApi(Games.API)
.build();
mPresenter.bindGoogleApiClient(client);
client.registerConnectionCallbacks(mPresenter);
client.registerConnectionFailedListener(mPresenter);
Intent intent = Auth.GoogleSignInApi.getSignInIntent(client);
startActivityForResult(intent, RC_SIGN_IN);
@Override
protected void onActivityResult(int request, int response, Intent data) {
super.onActivityResult(request, response, data);
if (request == RC_SIGN_IN) {
if(response == RESULT_OK) {
Games.Players.getCurrentPlayer(mPresenter.getGoogleApiClient()).getPlayerId();//returns different id's based on whether user was created before or after game was published.
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
result.getSignInAccount().getId();//returns legacy id
}
}

您可以查看 https://github.com/playgameservices/clientserverskeleton 中的示例

需要注意的一件事是,如果您只使用游戏配置和请求AuthCode(),则不会向用户提供额外的同意提示。

如果您请求其他项目和范围,则 GoogleSignIn API 不会使用游戏 ID。 要获取游戏特定的 ID,请使用:

GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
GoogleSignInAccount acct = result.getSignInAccount();
Log.d(TAG,"Legacy account = " + acct.getId());
Log.d(TAG,"Games Id:" + Games.Players.getCurrentPlayer
(mGoogleApiClient).getPlayerId());

最新更新