2014-03-19 61 views
2

最近我一直在處理Android上的Google+登錄,有一件事讓我煩惱。爲什麼Google+登錄會導致登錄錯誤?

在所有官方認可的示例中,都沒有專門顯示登錄過程的方法。被稱爲每次嘗試登錄有人在叫resolveSignInError()時間的方法如下所示:

private void resolveSignInError() { 
    if (mConnectionResult.hasResolution()) { 
     try { 
      mIntentInProgress = true; 
      mConnectionResult.startResolutionForResult(this, RC_SIGN_IN); 
      Log.d("mGoogleApiClient ", mGoogleApiClient.toString()); 

     } catch (IntentSender.SendIntentException e) { 
      mIntentInProgress = false; 
      mGoogleApiClient.connect(); 
     } 
    } 
} 

此方法還依賴於一個事實,即有一個mConnectionResult,這是在設置連接失敗的方法

public void onConnectionFailed(ConnectionResult result) { 
    if (!result.hasResolution()) { 
     GooglePlayServicesUtil.getErrorDialog(result.getErrorCode(), this, 
       0).show(); 
     return; 
    } 

    if (!mIntentInProgress) { 
     // Store the ConnectionResult for later usage 
     mConnectionResult = result; 

     if (mSignInClicked) { 
      // The user has already clicked 'sign-in' so we attempt to 
      // resolve all 
      // errors until the user is signed in, or they cancel. 
      resolveSignInError(); 
     } 
    } 
} 

因此,整個計劃圍繞已經無法登錄至少一次。 有沒有人知道爲什麼沒有一種方法,直接登錄到谷歌加嗎? 爲什麼這是有意義的結構可讀的軟件?

回答

2

的原因是,該設備可以不知道你是否真的需要登錄與否 - 登錄實際上更像訪問一個設施(就像你可能使用的位置),而不是輸入用戶名和密碼。基本流程如下:

  1. 連接到Google Play服務,查看該應用是否被授權。
  2. 如果有,連接成功。
  3. 如果沒有,則連接失敗。

如果您然後想要登錄,則需要檢查連接結果。

微妙的是,即使用戶以前從未在設備上使用該應用程序,您也可以轉到第2步!所以,例如,如果我去你的網站並登錄,然後安裝你的Android應用程序。

  1. 的應用程序啓動,並檢索您的用戶帳戶列表(通過GET_ACCOUNTS許可)
  2. 它試圖與任何帳戶連接到谷歌Play服務
  3. 谷歌Play服務,召喚出的谷歌auth服務器,發現你在該應用程序已經簽署(在這種情況下,在網絡上)
  4. 的應用得到onConnected回調

所以沒有登錄方法的原因,我即登錄狀態實際上是遠程的 - 它位於Google服務器上,而不是設備本身。因此流程必須是異步的。

+1

非常感謝您的明確解釋! –

+0

@MichaelAlanHuff http://stackoverflow.com/questions/31283697/how-to-solve-error-while-implementing-sign-in-with-google-plus-and-facebook-in-a?noredirect=1#comment50561722_31283697你能幫我嗎? –

-1

這是非常正常的例子https://developers.google.com/+/mobile/android/sign-in

有方法

`@Override 
public void onConnected(Bundle connectionHint) { 
    mSignInClicked = false; 
    Toast.makeText(this, "User is connected!", Toast.LENGTH_LONG).show(); 
}` 

第一步是有https://developers.google.com/+/mobile/android/getting-started

+0

看伊恩·巴伯的答案的格式。我的問題是要求一個概念性的解釋,而不是一個代碼示例。目前你的迴應並沒有解決我的問題。 –