【问题标题】:How do i ensure I always get the new google games playerId instead of the legacy id?我如何确保我总是获得新的谷歌游戏 playerId 而不是旧的 id?
【发布时间】:2017-04-07 05:50:17
【问题描述】:

虽然我的应用程序处于 Alpha 版且未发布,但只要用户登录 google 玩游戏,我就会得到他们的 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 及其引用的问题,似乎我现在获得的第二个版本的 id 是一个过时的版本,它与用户的 google plus 帐户相关联。据说新版本(带有前缀 g)是可用的,因此玩家无需拥有 google plus 帐户即可玩我的游戏。请参阅this 发布关于更换 id 的 google 公告。听起来统一插件返回新的 id 而原生的 android 库没有。

所以我的问题是,为什么在最新版本的 google play 游戏服务 (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
    }
}

【问题讨论】:

    标签: android google-play-games


    【解决方案1】:

    您可以查看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());
    

    【讨论】:

    • 感谢您的回复。正如我在问题Games.Players.getCurrentPlayer (mGoogleApiClient).getPlayerId()) 中提到的那样,并不总是返回新的ID。事实上,它总是为新注册返回旧 id。它将返回在我发布之前注册的用户的新 ID(因此至少对他们来说是一致的)。但是现在我的游戏发布了,我只为新用户获取旧版 ID。我能做些什么,这样就不会发生这种情况,所以我总是得到新的 id?
    • 请看我的评论
    • 让我看看几件事情,然后回复你。
    • 这方面有什么进展吗?
    猜你喜欢
    • 2016-07-08
    • 2012-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多