我如何确保我总是得到新的谷歌游戏playerId而不是遗留ID?

时间:2017-04-06 20:49:56

标签: android google-play-games

虽然我的应用程序处于alpha版和未发布状态,但只要用户登录Google Play游戏,我就会获得他们的ID Games.Players.getCurrentPlayer(mGoogleApiClient).getPlayerId(),并且会以此格式返回ID

  

g07610263060548408114

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

  

117053902313732480537

(我不是说从alpha到beta的进展或者我发布的这种进展导致了这种情况,但是当我开始注意到改变的时候。)

通过阅读github上的unity插件项目中的一些问题, Native Android Google+ User ID different than using Unity Plugin #1277以及它引用的问题,似乎我现在获得的第二个版本是一个过时的版本,链接到用户的谷歌加帐户。据推测,新版本(带有前缀g)可以让玩家不需要使用谷歌加帐户来玩我的游戏。有关更换ID的Google公告,请参阅this帖子。这听起来像Unity插件返回新的id而本机的android库没有。

所以我的问题是,为什么在谷歌游戏服务(10.2.1)的最新版本中,我获得了用户遗留ID的ID?我怎样才能获得新版本 - 与匹配中参与者ID相同的版本?

我尝试在api中使用谷歌的新标志,但这也给了我遗留的ID。即使是在我获得新的id格式之前的用户。

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

我的活动目前扩展了BaseGameActivity  这是我在尝试新登录之前用来初始化客户端的一些代码

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

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

我获得playerId的这一行要么返回旧格式的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
    }
}

1 个答案:

答案 0 :(得分:0)

您可以查看https://github.com/playgameservices/clientserverskeleton

中的示例

要注意的一件事是,如果您只使用游戏配置和requestAuthCode(),则没有其他用户同意提示。

如果您要求其他项目和范围,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());