1

我想从服务中使用 GamesClient。但是,我发现了一个问题,并且我花了几天时间研究代码,但看不到解决它的方法。注意:我已经正确设置了按键,并且能够很好地运行 Buttonclicker 示例。

我下载了 ButtonClicker 并将其用作我想做的事情的基础。将 GameHelper 转换为服务没有问题。只有 UI 部分需要一个 Activity,其余的只需要一个 Context。我不需要弹出式 UI;如果登录凭据错误,那么我只想登录失败。所以“自动登录”应该没问题。但是,我很快发现它拒绝连接。

我发现即使是标准版本的 GameHelper 也总是无法通过初始自动登录。特别是在 connectCurrentClient() 中:

case CLIENT_GAMES: mGamesClient.connect(); 休息;

登录总是失败并调用失败监听器(onConnectionFailed())。这反过来又调用了解析器(第 758 行):

mConnectionResult.startResolutionForResult(mActivity, RC_RESOLVE);

“神奇地”解决了它。它不会弹出一个对话框来询问用户的凭据(因为它们已经是正确的!)尽管它似乎确实短暂地闪现了某种对话框并立即将其删除。然后它将成功为 mGamesClient.connect();

一切都很好,除了 startResolutionForResult() 需要 UI 的 Activity - 这正是我不想要的。

我觉得奇怪的是自动登录不起作用 - 它总是失败并且需要第二次尝试,并且只有在神秘的 startResolutionForResult() 完成它所做的任何事情之后才会起作用。mConnectionResult 中给出的原因是它“必须登录”。如果我删除 startResolutionForResult() 行并尝试另一个连接,它会再次失败,此外,在执行 mGamesClient.connect(); 时还有一条关于没有关闭连接的错误消息;

如果我尝试通过指定 CLIENT_PLUS 而不是 CLIENT_GAMES 来设置 GamesHelper,那么一切都会按预期工作 - 我登录到 Google Plus 帐户并且永远不会调用 onConnectionFailed()。

除了询问这是否是 Google 代码中的错误,并询问如果 startResolutionForResult() 执行了一些额外的魔法来使连接正常工作,那么运行 connect() 的意义何在,有什么办法可以解决这个问题吗?具体来说,我不想要 UI,所以我永远不能使用 startResolutionForResult() - 我不应该这样做,因为在我编码的情况下,连接和登录首先是正确的。

我也不确定 mConnectionResult 中的错误消息的真正含义:它说我需要“登录”,但这正是我试图通过使用有效凭据连接到 Games 服务来自动执行的操作,对吗?如果我先使用 CLIENT_PLUS 登录,它仍然拒绝连接 CLIENT_GAMES。

经过多年阅读 SO,我的第一个 SO 问题 - 我完全没有想法!

4

2 回答 2

0

IanB 一样,我的评论/问题太长,无法发表评论;但我们会得到答案:)

首先,您如何向 GameClient 提供凭据?

我遇到了这个问题——尽管我将登录流逻辑包装在一个保留的片段中。我还发现startResolutionForResult()每次调用后beginUserInitiatedSignIn()都会调用,偶尔会在尝试“自动登录”时调用。

但是,在所有情况下, startResolutionForResult()仅当登录凭据不可用或不明确(例如,设备上有多个 gMail 帐户)时才会调用。

GameHelper.onActivityResult()从我的活动中拨打电话onActivityResult()会弹出“选择要登录的帐户”对话框。选择一个帐户可以让登录过程成功结束。

我怀疑在您的情况下,登录凭据(可能是正确的)实际上并未在正确的时间提供给 GMS,因此登录失败并调用resolveConnectionResult(). 你能确认resolveConnectionResult()提供的错误代码吗?IanB 的日志中显示的是“SIGNIN_REQUIRED”吗?或者是别的什么?

于 2013-11-26T13:11:29.833 回答
0

目前我无法回答您的问题,但我想向您展示这条踪迹,但它不太适合评论。这适用于之前已登录的用户:

07-04 10:11:38.461: D/ian_(1457): MultiTab3 onStart
07-04 10:11:38.461: D/ian_(1457): onStart.
07-04 10:11:38.461: D/ian_(1457): onStart: connecting clients.
07-04 10:11:38.550: D/ian_(1457): Connecting GamesClient.
07-04 10:11:39.050: D/ian_(1457): onConnected: connected! client=1
07-04 10:11:39.050: D/ian_(1457): All clients now connected. Sign-in successful.
07-04 10:11:39.050: D/ian_(1457): All requested clients connected. Sign-in succeeded!
07-04 10:11:39.050: D/ian_(1457): MultiTab3 onSignInSucceeded
07-04 10:11:39.050: D/ian_(1457): MultiTab3 setShowSignInButton=false
07-04 10:11:39.050: D/ian_(1457): MultiTab3 updateUi
07-04 10:11:39.080: D/ian_(1457): MultiTab3 getGamesClient
07-04 10:11:39.100: D/ian_(1457): MultiTab3 setGreeting
07-04 10:11:39.100: D/ian_(1457): MultiTab3 updateUi

如果我理解正确,以下跟踪适用于您描述的情况:

07-04 10:21:54.511: D/ian_(1781): MultiTab3 beginUserInitiatedSignIn
07-04 10:21:54.531: D/ian_(1781): isGooglePlayServicesAvailable returned 0
07-04 10:21:54.531: D/ian_(1781): beginUserInitiatedSignIn: continuing pending sign-in flow.
07-04 10:21:54.611: D/ian_(1781): resolveConnectionResult: trying to resolve result: C      onnectionResult{statusCode=SIGN_IN_REQUIRED, resolution=PendingIntent{40f3ed38: android.os.BinderProxy@40ee3de0}}
07-04 10:21:54.611: D/ian_(1781): result has resolution. Starting it.
07-04 10:21:54.621: D/ian_(1781): startResolutionForResult - this may be prob ?
07-04 10:23:29.480: D/ian_(1781): MultiPlayer onActivityResult called9001-1null
07-04 10:23:29.520: D/ian_(1781): MultiPlayer passing onActivityResult to MultiTab3 Req/Resp/Data=9001-1null
07-04 10:23:29.520: D/ian_(1781): MultiTab3 onActivityResult - passing through to GameHelper ...9001-1null
07-04 10:23:29.520: D/ian_(1781): onActivityResult, req 9001 response -1
07-04 10:23:29.520: D/ian_(1781): responseCode == RESULT_OK. So connecting.
07-04 10:23:30.130: D/ian_(1781): onConnected: connected! client=1
07-04 10:23:30.130: D/ian_(1781): All clients now connected. Sign-in successful.
07-04 10:23:30.130: D/ian_(1781): All requested clients connected. Sign-in succeeded!

因此,beginUserInitiatedSignIn (GameHelper) 中的这段代码是我最初关注的地方:

    mUserInitiatedSignIn = true;
    if (mConnectionResult != null) {
        // We have a pending connection result from a previous failure, so
        // start with that.
        debugLog("beginUserInitiatedSignIn: continuing pending sign-in flow.");
        showProgressDialog(true);
        resolveConnectionResult();
    } else {
        // We don't have a pending connection result, so start anew.
        debugLog("beginUserInitiatedSignIn: starting new sign-in flow.");
        startConnections();
    }

我会首先考虑删除/更改“if”子句中的代码——你真的需要处理挂起的连接吗?我不知道,但稍加思考,您可能可以实现您想要的。祝你好运 !

更新:这就是我所做的,对我来说很好用!如果它在您的新项目中不起作用,可能是因为您的项目中存在其他一些定义/编码问题。我建议你先在一个工作项目中尝试一下(例如 TypeANumber)。

    /*if (mConnectionResult != null) {
        // We have a pending connection result from a previous failure, so
        // start with that.
        debugLog("beginUserInitiatedSignIn: continuing pending sign-in flow.");
        showProgressDialog(true);
        resolveConnectionResult();
    } else {
        // We don't have a pending connection result, so start anew.
        debugLog("beginUserInitiatedSignIn: starting new sign-in flow.");
        startConnections();
    }*/
    debugLog("beginUserInitiatedSignIn: starting new sign-in flow.");
    mConnectionResult=null;     //ib18 test
    startConnections();
于 2013-07-04T10:50:16.923 回答