1

サービスから GamesClient を使用したいと思います。しかし、私は問題を発見し、コードをいじって数日を費やしたが、それを回避するための解決策が見当たらない. 注: キーが正しく設定されており、Buttonclicker の例を問題なく実行できます。

私は ButtonClicker をダウンロードし、やりたいことの基礎としてそれを使用しました。GameHelper をサービスに変換しても問題ありません。UI パーツのみがアクティビティを必要とし、残りはコンテキストのみを必要とします。ポップアップ UI は必要ありません。ログイン資格情報が間違っている場合は、ログインに失敗したいだけです。したがって、「自動ログイン」は問題ないはずです。しかし、すぐに接続を拒否していることに気付きました。

GameHelper のストック標準バージョンでさえ、常に最初の自動ログインに失敗することがわかりました。具体的には、次の connectCurrentClient() で:

ケース CLIENT_GAMES: mGamesClient.connect(); 壊す;

ログインは常に失敗し、失敗リスナー (onConnectionFailed()) を呼び出します。これにより、次のリゾルバーが呼び出されます (758 行目):

mConnectionResult.startResolutionForResult(mActivity, RC_RESOLVE);

「魔法のように」解決します。ユーザーに資格情報を要求するダイアログはポップアップしません (資格情報は既に正しいためです!) が、ある種のダイアログが短時間表示され、すぐに削除されるように見えます。その後、mGamesClient.connect(); で成功します。

startResolutionForResult() が UI のアクティビティを必要とすることを除いて、すべて問題ありません。これはまさに私が望んでいないことです。

自動ログインが機能しないのは奇妙だと思います-常に失敗し、2回目の試行が必要であり、神秘的な startResolutionForResult() が何をしても機能しない場合にのみ機能します。mConnectionResult に示されている理由は、「サインインしている必要がある」ためです。startResolutionForResult() 行を削除して別の接続を試みると、再び失敗し、さらに mGamesClient.connect(); の実行時に接続を閉じていないというエラー メッセージが表示されます。

CLIENT_GAMES の代わりに CLIENT_PLUS を指定して GamesHelper を設定しようとすると、すべて期待どおりに動作します - Google Plus アカウントにログインしていますが、onConnectionFailed() は呼び出されません。

これが Google のコードのバグであるかどうかを尋ね、startResolutionForResult() が接続を機能させるために追加の魔法を実行する場合、connect() を実行する意味は何かを尋ねる以外に、これを回避する方法はありますか? 具体的には、UI が必要ないため、startResolutionForResult() を使用することはできません。コーディングしている状況では、接続とサインインが最初から正しいため、使用する必要はありません。

また、mConnectionResult のエラー メッセージが実際に何を意味するのかもわかりません。「サインイン」する必要があると書かれていますが、有効な資格情報を使用してゲーム サービスに接続することで、まさにそれを自動的に行おうとしています。最初に CLIENT_PLUS を使用してサインインすると、引き続き CLIENT_GAMES への接続が拒否されます。

SO を何年も読んだ後、私の最初の SO の質問です。

4

2 に答える 2

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 に答える