Tích hợp tính năng Đăng nhập bằng Google vào ứng dụng Android
Sử dụng bộ sưu tập để sắp xếp ngăn nắp các trang
Lưu và phân loại nội dung dựa trên lựa chọn ưu tiên của bạn.
Để tích hợp tính năng Đăng nhập bằng Google vào ứng dụng Android, hãy định cấu hình tính năng Đăng nhập bằng Google và thêm một nút vào bố cục của ứng dụng để bắt đầu quy trình đăng nhập.
Trước khi bắt đầu
Định cấu hình dự án Google API Console và thiết lập dự án Android Studio.
Định cấu hình tính năng Đăng nhập bằng Google và đối tượng GoogleSignInClient
Trong phương thức onCreate của hoạt động đăng nhập, hãy định cấu hình tính năng Đăng nhập bằng Google để yêu cầu dữ liệu người dùng mà ứng dụng của bạn yêu cầu. Ví dụ: để định cấu hình tính năng Đăng nhập bằng Google nhằm yêu cầu mã nhận dạng và thông tin hồ sơ cơ bản của người dùng, hãy tạo một đối tượng GoogleSignInOptions bằng tham số DEFAULT_SIGN_IN. Để yêu cầu địa chỉ email của người dùng, hãy tạo đối tượng GoogleSignInOptions bằng lựa chọn requestEmail.
// Configure sign-in to request the user's ID, email address, and basic// profile. ID and basic profile are included in DEFAULT_SIGN_IN.GoogleSignInOptionsgso=newGoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN).requestEmail().build();
Nếu bạn cần yêu cầu thêm các phạm vi để truy cập vào API của Google, hãy chỉ định các phạm vi đó bằng requestScopes.
Để mang lại trải nghiệm tốt nhất cho người dùng, khi đăng nhập, bạn chỉ nên yêu cầu những phạm vi tối thiểu cần thiết để ứng dụng hoạt động. Chỉ yêu cầu các phạm vi bổ sung khi bạn cần, để người dùng thấy màn hình đồng ý trong bối cảnh của một hành động mà họ đã thực hiện.
Xem phần Yêu cầu các phạm vi bổ sung.
Sau đó, cũng trong phương thức onCreate của hoạt động đăng nhập, hãy tạo một đối tượng GoogleSignInClient bằng các lựa chọn bạn đã chỉ định.
// Build a GoogleSignInClient with the options specified by gso.mGoogleSignInClient=GoogleSignIn.getClient(this,gso);
Kiểm tra xem người dùng đã đăng nhập có tồn tại hay không
Trong phương thức onStart của hoạt động, hãy kiểm tra xem người dùng đã đăng nhập vào ứng dụng của bạn bằng Google hay chưa.
// Check for existing Google Sign In account, if the user is already signed in// the GoogleSignInAccount will be non-null.GoogleSignInAccountaccount=GoogleSignIn.getLastSignedInAccount(this);updateUI(account);
Nếu GoogleSignIn.getLastSignedInAccount trả về một đối tượng GoogleSignInAccount (thay vì null), thì người dùng đã đăng nhập vào ứng dụng của bạn bằng Google.
Cập nhật giao diện người dùng cho phù hợp, tức là ẩn nút đăng nhập, chạy hoạt động chính hoặc bất cứ điều gì phù hợp với ứng dụng của bạn.
Nếu GoogleSignIn.getLastSignedInAccount trả về null, tức là người dùng chưa đăng nhập vào ứng dụng của bạn bằng Google. Cập nhật giao diện người dùng để hiển thị nút Đăng nhập bằng Google.
Thêm nút Đăng nhập bằng Google vào ứng dụng của bạn
Không bắt buộc: Nếu đang sử dụng đồ hoạ nút đăng nhập mặc định thay vì cung cấp các thành phần nút đăng nhập của riêng mình, bạn có thể tuỳ chỉnh kích thước của nút bằng phương thức setSize.
// Set the dimensions of the sign-in button.SignInButtonsignInButton=findViewById(R.id.sign_in_button);signInButton.setSize(SignInButton.SIZE_STANDARD);
Trong hoạt động Android (ví dụ: trong phương thức onCreate), hãy đăng ký OnClickListener của nút để đăng nhập khi người dùng nhấp vào:
Trong phương thức onClick của hoạt động, hãy xử lý các thao tác nhấn vào nút đăng nhập bằng cách tạo một ý định đăng nhập bằng phương thức getSignInIntent và bắt đầu ý định bằng startActivityForResult.
Việc bắt đầu ý định sẽ nhắc người dùng chọn một Tài khoản Google để đăng nhập. Nếu bạn đã yêu cầu các phạm vi ngoài profile, email và openid, thì người dùng cũng sẽ được nhắc cấp quyền truy cập vào các tài nguyên được yêu cầu.
Sau khi người dùng đăng nhập, bạn có thể nhận được một đối tượng GoogleSignInAccount cho người dùng trong phương thức onActivityResult của hoạt động.
Bạn cũng có thể lấy địa chỉ email của người dùng bằng getEmail, mã nhận dạng Google của người dùng (để sử dụng phía máy khách) bằng getId và mã thông báo nhận dạng cho người dùng bằng getIdToken.
Nếu cần truyền người dùng hiện đã đăng nhập đến một máy chủ phụ trợ, hãy gửi mã thông báo nhận dạng đến máy chủ phụ trợ và xác thực mã thông báo đó trên máy chủ.
Nội dung và mã mẫu trên trang này phải tuân thủ các giấy phép như mô tả trong phần Giấy phép nội dung. Java và OpenJDK là nhãn hiệu hoặc nhãn hiệu đã đăng ký của Oracle và/hoặc đơn vị liên kết của Oracle.
Cập nhật lần gần đây nhất: 2025-07-27 UTC.
[[["Dễ hiểu","easyToUnderstand","thumb-up"],["Giúp tôi giải quyết được vấn đề","solvedMyProblem","thumb-up"],["Khác","otherUp","thumb-up"]],[["Thiếu thông tin tôi cần","missingTheInformationINeed","thumb-down"],["Quá phức tạp/quá nhiều bước","tooComplicatedTooManySteps","thumb-down"],["Đã lỗi thời","outOfDate","thumb-down"],["Vấn đề về bản dịch","translationIssue","thumb-down"],["Vấn đề về mẫu/mã","samplesCodeIssue","thumb-down"],["Khác","otherDown","thumb-down"]],["Cập nhật lần gần đây nhất: 2025-07-27 UTC."],[],[],null,["# Integrate Google Sign-In into Your Android App\n\n| **Warning:**\n|\n| **The Google Sign-In for Android API is outdated and no longer supported.**\n| To ensure the continued security and usability of your app, [migrate your Sign in with\n| Google implementation to Credential Manager](/identity/sign-in/credential-manager-siwg) today. Credential Manager\n| supports passkey, password, and federated identity authentication (such as\n| Sign-in with Google), stronger security, and a more consistent user\n| experience.\n|\n| **For Wear developers:** Credential Manager will be supported in Wear OS\n| 5.1 and later on selected watches. Developers actively supporting Wear OS 3, 4\n| and 5.0 devices with Sign in with Google should continue using Google Sign-in\n| for Android for your Wear applications. Sign in with Google support will be\n| available on Credential Manager APIs for these versions of WearOS at a later\n| date.\n\nTo integrate Google Sign-In into your Android app, configure Google Sign-In and\nadd a button to your app's layout that starts the sign-in flow.\n\nBefore you begin\n----------------\n\nConfigure a Google API Console project and set up your Android Studio project.\n\nConfigure Google Sign-in and the GoogleSignInClient object\n----------------------------------------------------------\n\n1. In your sign-in activity's `onCreate` method, configure Google Sign-In to\n request the user data required by your app. For example, to configure\n Google Sign-In to request users' ID and basic profile information, create a\n [`GoogleSignInOptions`](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder.html#GoogleSignInOptions.Builder())\n object with the `DEFAULT_SIGN_IN` parameter. To request users' email\n addresses as well, create the `GoogleSignInOptions` object with the\n `requestEmail` option.\n\n ```carbon\n // Configure sign-in to request the user's ID, email address, and basic\n // profile. ID and basic profile are included in DEFAULT_SIGN_IN.\n GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)\n .requestEmail()\n .build();\n ```\n\n If you need to request additional scopes to access Google APIs, specify them\n with [`requestScopes`](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInOptions.Builder.html#requestScopes(com.google.android.gms.common.api.Scope,%20com.google.android.gms.common.api.Scope...)).\n For the best user experience, on sign-in, only request the scopes that are\n required for your app to minimally function. Request any additional scopes\n only when you need them, so that your users see the consent screen in the\n context of an action they performed.\n See [Requesting Additional Scopes](https://developers.google.com/identity/sign-in/android/additional-scopes).\n2. Then, also in your sign-in activity's `onCreate` method, create a\n `GoogleSignInClient` object with the options you specified.\n\n ```scilab\n // Build a GoogleSignInClient with the options specified by gso.\n mGoogleSignInClient = GoogleSignIn.getClient(this, gso);\n ```\n\nCheck for an existing signed-in user\n------------------------------------\n\nIn your activity's `onStart` method, check if a user has already signed in to\nyour app with Google. \n\n```scilab\n// Check for existing Google Sign In account, if the user is already signed in\n// the GoogleSignInAccount will be non-null.\nGoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);\nupdateUI(account);\n```\n\nIf `GoogleSignIn.getLastSignedInAccount` returns a `GoogleSignInAccount` object\n(rather than `null`), the user has already signed in to your app with Google.\nUpdate your UI accordingly---that is, hide the sign-in button, launch your\nmain activity, or whatever is appropriate for your app.\n\nIf `GoogleSignIn.getLastSignedInAccount` returns `null`, the user has not yet\nsigned in to your app with Google. Update your UI to display the Google Sign-in\nbutton.\n| **Note:** If you need to detect changes to a user's auth state that happen outside your app, such as access token or ID token revocation, or to perform cross-device sign-in, you might also call `GoogleSignInClient.silentSignIn` when your app starts.\n\nAdd the Google Sign-in button to your app\n-----------------------------------------\n\n1.\n Add the [`SignInButton`](https://developers.google.com/android/reference/com/google/android/gms/common/SignInButton)\n in your application's layout:\n\n \u003ccom.google.android.gms.common.SignInButton\n android:id=\"@+id/sign_in_button\"\n android:layout_width=\"wrap_content\"\n android:layout_height=\"wrap_content\" /\u003e\n\n2. **Optional** : If you are using the default sign-in button graphic instead of\n providing your own sign-in button assets, you can customize the button's\n size with the [`setSize`](https://developers.google.com/android/reference/com/google/android/gms/common/SignInButton.html#setSize(int))\n method.\n\n ```scilab\n // Set the dimensions of the sign-in button.\n SignInButton signInButton = findViewById(R.id.sign_in_button);\n signInButton.setSize(SignInButton.SIZE_STANDARD);\n ```\n3. In the Android activity (for example, in the `onCreate` method), register\n your button's `OnClickListener` to sign in the user when clicked:\n\n findViewById(R.id.sign_in_button).setOnClickListener(this);\n\nStart the sign-in flow\n----------------------\n\n1.\n In the activity's `onClick` method, handle sign-in button taps by creating a\n sign-in intent with the [`getSignInIntent`](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInClient#getSignInIntent())\n method, and starting the intent with `startActivityForResult`.\n\n @Override\n public void onClick(View v) {\n switch (v.getId()) {\n case R.id.sign_in_button:\n signIn();\n break;\n // ...\n }\n }\n\n ```scdoc\n private void signIn() {\n Intent signInIntent = mGoogleSignInClient.getSignInIntent();\n startActivityForResult(signInIntent, RC_SIGN_IN);\n }\n ```\n\n Starting the intent prompts the user to select a Google Account to sign in\n with. If you requested scopes beyond `profile`, `email`, and `openid`, the\n user is also prompted to grant access to the requested resources.\n2. After the user signs in, you can get a [`GoogleSignInAccount`](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount.html)\n object for the user in the activity's `onActivityResult` method.\n\n ```transact-sql\n @Override\n public void onActivityResult(int requestCode, int resultCode, Intent data) {\n super.onActivityResult(requestCode, resultCode, data);\n\n // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...);\n if (requestCode == RC_SIGN_IN) {\n // The Task returned from this call is always completed, no need to attach\n // a listener.\n Task\u003cGoogleSignInAccount\u003e task = GoogleSignIn.getSignedInAccountFromIntent(data);\n handleSignInResult(task);\n }\n }\n ```\n\n The `GoogleSignInAccount` object contains information about the signed-in\n user, such as the user's name. \n\n ```css+lasso\n private void handleSignInResult(Task\u003cGoogleSignInAccount\u003e completedTask) {\n try {\n GoogleSignInAccount account = completedTask.getResult(ApiException.class);\n\n // Signed in successfully, show authenticated UI.\n updateUI(account);\n } catch (ApiException e) {\n // The ApiException status code indicates the detailed failure reason.\n // Please refer to the GoogleSignInStatusCodes class reference for more information.\n Log.w(TAG, \"signInResult:failed code=\" + e.getStatusCode());\n updateUI(null);\n }\n }\n ```\n\n You can also get the user's email address with [`getEmail`](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount.html#getEmail()),\n the user's Google ID (for client-side use) with [`getId`](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount.html#getId()),\n and an ID token for the user with [`getIdToken`](https://developers.google.com/android/reference/com/google/android/gms/auth/api/signin/GoogleSignInAccount.html#getIdToken()).\n If you need to pass the currently signed-in user to a backend server,\n [send the ID token to your backend server](https://developers.google.com/identity/sign-in/android/backend-auth)\n and validate the token on the server."]]