Google Play服务GamesClient无法自动连接

时间:2013-07-04 08:14:02

标签: android client

我想从服务中使用GamesClient。但是,我发现了一个问题,我花了好几天时间玩这些代码,看不到绕过它的解决方案。注意:我已正确设置了键,我可以正常运行Buttonclicker示例。

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

我发现即使是GameHelper的股票标准版本也始终无法进行初始自动登录。特别是在connectCurrentClient()中:

案例CLIENT_GAMES:    mGamesClient.connect();    打破;

登录始终失败并调用失败侦听器(onConnectionFailed())。这反过来调用调用的解析器(第758行):

mConnectionResult.startResolutionForResult(mActivity,RC_RESOLVE);

“神奇地”解决了它。它没有弹出一个对话框来询问用户的凭据(因为它们已经是正确的!)虽然它看起来似乎只是闪烁某种对话框并立即将其删除。然后它将成功用于mGamesClient.connect();

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

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

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

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

我也不确定mConnectionResult中的错误消息是什么意思:它说我需要“登录”,但这正是我尝试通过使用有效凭据连接到游戏服务而自动执行的操作,当然?如果我首先使用CLIENT_PLUS登录,它仍然拒绝连接CLIENT_GAMES。

经过多年阅读SO,我的第一个问题 - 我的想法非常多!

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分:0)

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

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

我遇到了这个问题 - 尽管我在保留的Fragment中包含了登录流逻辑的路径。我还发现在startResolutionForResult()被调用后每次调用beginUserInitiatedSignIn(),偶尔在尝试“自动登录”时调用startResolutionForResult()

但是,在所有情况下,只有在登录凭据不可用或模糊不清时才会调用GameHelper.onActivityResult()(例如,设备上有多个gMail帐户)。

将来自我的活动onActivityResult()的{​​{1}}拨打电话会导致“选择要登录的帐户”对话框弹出。选择一个帐户可以使登录过程成功结束。

我怀疑在您的情况下,登录凭据(尽管可能是正确的)实际上并未在适当的时间提供给GMS,因此登录失败并呼叫resolveConnectionResult()。您能否确认resolveConnectionResult()提供的错误代码?它是“SIGNIN_REQUIRED”,如IanB的日志中所示?还是别的什么?