全新的 Google 登入 API

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 登入

事前準備

設定 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
});

登入成功後,一律會傳回使用者全名、電子郵件地址和個人資料相片網址。如果您需要更多資訊,可以將使用者導向完整的個人資料資訊流程。