Google Identity Services (GIS) 是一組全新的 API,在開發人員專用的容易實作套件中,讓使用者能輕鬆安全地登入及註冊。本文件詳述全新的 Google 登入 API (GIS 的一部分),可在使用者輕觸「使用 Google 帳戶登入」按鈕時,用於啟動登入或註冊流程。您可以使用這個 API 取代現有的 Google Sign-In API,執行登入流程。
只有在使用者明確顯示使用 Google 帳戶登入的意圖時,您才應使用此 API。舉例來說,當使用者在應用程式中點選「使用 Google 帳戶登入」按鈕時,就可以使用這個 API。
請不要使用此 API 來提示使用者在應用程式啟動時登入,或回應其他觸發條件 (例如將商品加入購物車)。針對這些用途,請使用 One Tap 登入與註冊。
使用新的 API 啟動 Google 登入流程時,系統會顯示以下 UI:
事前準備
設定 Google API 控制台專案,並設定 Android Studio 專案。
提出登入要求
如要使用 Identity API 啟動 Google 登入流程,請建構 GetSignInRequest
物件。然後,在 SignInClient
物件上呼叫 getSignInIntent
。這項呼叫是非同步的,成功時會提供 PendingIntent
來啟動對話方塊。
private static final int REQUEST_CODE_GOOGLE_SIGN_IN = 1; /* unique request id */
private void signIn() {
GetSignInIntentRequest request =
GetSignInIntentRequest.builder()
.setServerClientId(getString(R.string.server_client_id))
.build();
Identity.getSignInClient(activity)
.getSignInIntent(request)
.addOnSuccessListener(
result -> {
try {
startIntentSenderForResult(
result.getIntentSender(),
REQUEST_CODE_GOOGLE_SIGN_IN,
/* fillInIntent= */ null,
/* flagsMask= */ 0,
/* flagsValue= */ 0,
/* extraFlags= */ 0,
/* options= */ null);
} catch (IntentSender.SendIntentException e) {
Log.e(TAG, "Google Sign-in failed");
}
})
.addOnFailureListener(
e -> {
Log.e(TAG, "Google Sign-in failed", e);
});
}
處理登入結果
在 onActivityResult
中,擷取 SignInCredential
。從 getSignInCredentialFromIntent
傳回的 SignInCredential
物件中包含有效登入的相關資訊。如果使用者因為某些原因而無法登入,系統會擲回 ApiException
。
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(resultCode == Activity.RESULT_OK) {
if (requestCode == REQUEST_CODE_GOOGLE_SIGN_IN) {
try {
SignInCredential credential = Identity.getSignInClient(this).getSignInCredentialFromIntent(data);
// Signed in successfully - show authenticated UI
updateUI(credential);
} catch (ApiException e) {
// The ApiException status code indicates the detailed failure reason.
}
}
}
}
private ActivityResultLauncher<IntentSenderRequest> loginResultHandler = registerForActivityResult(new ActivityResultContracts.StartIntentSenderForResult(), result -> {
// handle intent result here
});
登入成功後,一律會傳回使用者全名、電子郵件地址和個人資料相片網址。如果您需要更多資訊,可以將使用者導向完整的個人資料資訊流程。