2013-07-04 69 views
1

我想使用服務中的GamesClient。但是,我發現了一個問題,我無法看到解決方案,因爲花了幾天的時間來玩代碼。注意:我已正確設置了按鍵,並且我可以很好地運行Buttonclicker示例。Google Play Services GamesClient無法自動連接

我下載了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中的錯誤消息是什麼意思:它說我需要「登錄」,但這正是我試圖自動連接到有效的遊戲服務憑據,當然?如果我先使用CLIENT_PLUS登錄,則它仍拒絕爲CLIENT_GAMES連接。

經過多年的閱讀,我的第一個SO問題 - 我有很多想法!

+0

評論刪除 – IanB

回答

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: [email protected]}} 
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(); 
    } 

我會被考慮刪除/更改代碼中的「如果」條款啓動 - 你真的 需要處理掛起的連接?我不知道,但有一點想法,你可能可以實現你想要的。祝你好運 !

更新:這是我做的,它對我來說很好!如果它不適用於您的新項目,可能是因爲您的項目中存在其他定義/編碼問題。我建議你先在一個工作項目中嘗試一下(例如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(); 
+0

感謝您的建議。但是,mConnectionResult最初爲空,當第一次(自動)嘗試時連接失敗時,它將設置爲結果(其中有失敗原因和未決意圖)。如果您刪除了處理掛起的這一部分,則意味着connect()會再次被調用,並且會再次失敗,因爲它一直會這樣,直到調用了神奇的startResolutionForResult()。看起來,startResolutionForResult()是實際進行連接和登錄的唯一API調用......這很荒唐。 – CBN

+0

你確定嗎?你所說的不符合我在我的痕跡中看到的。此外,我只是試了一下(見上面的編輯),它工作得很好... – IanB

+0

...就是 - 如果我正確地理解問題。 – IanB

0

IanB一樣,我的評論/問題對於評論來說太長;但我們會回答:)

首先,您如何向GameClient提供憑據?

我遇到了這個問題 - 儘管我在保留的Fragment內部使用了登錄流邏輯的包裝路線。我也發現每次調用startResolutionForResult()後都會調用beginUserInitiatedSignIn(),偶爾嘗試「自動登錄」。

但是,在所有情況下,startResolutionForResult()僅在登錄憑據不可用或不明確(例如,設備上具有多個gMail帳戶)時被調用。

從我的活動onActivityResult()撥打電話到GameHelper.onActivityResult()導致「選擇帳戶登錄」對話框彈出。選擇一個帳戶可以使登錄過程成功結束。

我懷疑在你的情況下,登錄憑證(正確的,因爲他們可能)實際上並沒有在正確的時間提供給GMS,因此登錄失敗,並呼籲通過resolveConnectionResult()。您能否確認resolveConnectionResult()提供的錯誤代碼?它是否爲「SIGNIN_REQUIRED」,如IanB的日誌中所示?或者是別的什麼?

相關問題