Sau khi ngừng cung cấp API Đăng nhập bằng Google, chúng tôi sẽ xoá SDK games phiên bản 1 vào năm 2026. Sau tháng 2 năm 2025, bạn sẽ không thể xuất bản các trò chơi vừa tích hợp với SDK của games phiên bản 1 trên Google Play. Bạn nên sử dụng SDK của phiên bản 2.
Mặc dù các ứng dụng/trò chơi hiện có có tích hợp trò chơi phiên bản 1 trước đó vẫn tiếp tục hoạt động trong vài năm nữa, nhưng bạn nên di chuyển sang phiên bản 2 kể từ tháng 6 năm 2025.
Hướng dẫn này dành cho việc sử dụng SDK Dịch vụ trò chơi của Play phiên bản 1. Để biết thông tin về phiên bản SDK mới nhất, hãy xem tài liệu phiên bản 2.
Để truy cập chức năng Dịch vụ trò chơi của Google Play, trò chơi của bạn cần cung cấp tài khoản người chơi đã đăng nhập. Nếu người chơi chưa được xác thực, trò chơi của bạn có thể gặp lỗi khi thực hiện lệnh gọi đến API Dịch vụ trò chơi của Google Play. Tài liệu này mô tả cách triển khai trải nghiệm đăng nhập liền mạch trong trò chơi của bạn.
Triển khai tính năng đăng nhập của người chơi
Lớp GoogleSignInClient
là điểm truy cập chính để truy xuất tài khoản của người chơi hiện đang đăng nhập và để đăng nhập cho người chơi nếu họ chưa đăng nhập vào ứng dụng của bạn trên thiết bị.
Để tạo một ứng dụng đăng nhập, hãy làm theo các bước sau:
Tạo một ứng dụng đăng nhập thông qua đối tượng
GoogleSignInOptions
, như minh hoạ trong đoạn mã sau. TrongGoogleSignInOptions.Builder
để định cấu hình quy trình đăng nhập, bạn phải chỉ địnhGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
.GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
Nếu bạn muốn sử dụng
SnapshotsClient
, hãy thêm.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
vàoGoogleSignInOptions.Builder
như minh hoạ trong đoạn mã sau:GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) .build();
Gọi phương thức
GoogleSignIn.getClient()
và truyền các lựa chọn mà bạn đã định cấu hình ở các bước trước. Nếu lệnh gọi thành công, Google Sign-In API sẽ trả về một phiên bản củaGoogleSignInClient
.
Kiểm tra xem người chơi đã đăng nhập hay chưa
Bạn có thể kiểm tra xem một tài khoản đã đăng nhập trên thiết bị hiện tại hay chưa bằng cách sử dụng GoogleSignIn.getLastSignedInAccount()
và kiểm tra xem tài khoản này đã được cấp các quyền cần thiết hay chưa bằng cách sử dụng GoogleSignIn.hasPermissions()
.
Nếu cả hai điều kiện đều đúng (tức là getLastSignedInAccount()
trả về một giá trị khác rỗng và hasPermissions()
trả về true
), bạn có thể sử dụng tài khoản được trả về từ getLastSignedInAccount()
một cách an toàn, ngay cả khi thiết bị đang ngoại tuyến.
Thực hiện quy trình đăng nhập thầm lặng
Bạn có thể gọi silentSignIn()
để truy xuất tài khoản của người chơi hiện đang đăng nhập và cố gắng đăng nhập cho người chơi mà không hiển thị giao diện người dùng nếu họ đã đăng nhập thành công vào ứng dụng của bạn trên một thiết bị khác.
Phương thức silentSignIn()
trả về một Task<GoogleSignInAccount>
. Khi tác vụ hoàn tất, bạn đặt trường GoogleSignInAccount
mà bạn đã khai báo trước đó thành tài khoản đăng nhập mà tác vụ trả về dưới dạng kết quả hoặc thành null
, cho biết không có người dùng nào đăng nhập.
Nếu không đăng nhập thầm lặng được, bạn có thể tuỳ ý gửi ý định đăng nhập để hiển thị giao diện người dùng đăng nhập, như mô tả trong phần Thực hiện quy trình đăng nhập tương tác.
Vì trạng thái của người chơi đã đăng nhập có thể thay đổi khi hoạt động không ở nền trước, nên chúng tôi đề xuất gọi silentSignIn()
từ phương thức onResume()
của hoạt động.
Để thực hiện quy trình đăng nhập thầm lặng, hãy làm theo các bước sau:
- Gọi phương thức
silentSignIn()
trênGoogleSignInClient
để bắt đầu quy trình đăng nhập thầm lặng. Lệnh gọi này trả về một đối tượngTask<GoogleSignInAccount>
chứaGoogleSignInAccount
nếu quá trình đăng nhập thầm lặng thành công. - Xử lý trạng thái thành công hoặc không thành công của quá trình đăng nhập của người chơi bằng cách ghi đè
OnCompleteListener
.- Nếu tác vụ đăng nhập thành công, hãy lấy đối tượng
GoogleSignInAccount
bằng cách gọigetResult()
. - Nếu đăng nhập không thành công, bạn có thể gửi ý định đăng nhập để khởi chạy quy trình đăng nhập tương tác.
Để xem danh sách các trình nghe lệnh gọi lại bổ sung mà bạn có thể sử dụng, hãy xem Hướng dẫn dành cho nhà phát triển Tasks API và tài liệu tham khảo về API
Task
.
- Nếu tác vụ đăng nhập thành công, hãy lấy đối tượng
Đoạn mã sau đây cho thấy cách ứng dụng của bạn có thể thực hiện quy trình đăng nhập thầm lặng:
private void signInSilently() { GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN; GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); if (GoogleSignIn.hasPermissions(account, signInOptions.getScopeArray())) { // Already signed in. // The signed in account is stored in the 'account' variable. GoogleSignInAccount signedInAccount = account; } else { // Haven't been signed-in before. Try the silent sign-in first. GoogleSignInClient signInClient = GoogleSignIn.getClient(this, signInOptions); signInClient .silentSignIn() .addOnCompleteListener( this, new OnCompleteListener<GoogleSignInAccount>() { @Override public void onComplete(@NonNull Task<GoogleSignInAccount> task) { if (task.isSuccessful()) { // The signed in account is stored in the task's result. GoogleSignInAccount signedInAccount = task.getResult(); } else { // Player will need to sign-in explicitly using via UI. // See [sign-in best practices](http://developers.google.com/games/services/checklist) for guidance on how and when to implement Interactive Sign-in, // and [Performing Interactive Sign-in](http://developers.google.com/games/services/android/signin#performing_interactive_sign-in) for details on how to implement // Interactive Sign-in. } } }); } } @Override protected void onResume() { super.onResume(); signInSilently(); }
Nếu không thể đăng nhập thầm lặng, bạn có thể gọi getException()
để lấy ApiException
kèm theo mã trạng thái chi tiết. Mã trạng thái CommonStatusCodes.SIGN_IN_REQUIRED
cho biết người chơi cần thực hiện hành động rõ ràng để đăng nhập. Trong trường hợp này, ứng dụng của bạn sẽ chạy một quy trình đăng nhập tương tác như mô tả trong phần tiếp theo.
Thực hiện quy trình đăng nhập tương tác
Để đăng nhập bằng cách tương tác với người chơi, ứng dụng của bạn cần khởi chạy ý định đăng nhập. Nếu thành công, API Đăng nhập bằng Google sẽ hiển thị một giao diện người dùng nhắc người chơi nhập thông tin đăng nhập để đăng nhập. Phương pháp này giúp đơn giản hoá quá trình phát triển ứng dụng của bạn, vì hoạt động đăng nhập sẽ xử lý các trường hợp như cần cập nhật Dịch vụ Google Play hoặc hiển thị lời nhắc đồng ý thay cho ứng dụng của bạn. Kết quả được trả về thông qua lệnh gọi lại onActivityResult
.
Để thực hiện quy trình đăng nhập một cách tương tác, hãy làm theo các bước sau:
Gọi
getSigninIntent()
trênGoogleSignInClient
để lấy một ý định đăng nhập, sau đó gọistartActivity()
và truyền ý định đó vào. Đoạn mã sau đây cho thấy cách ứng dụng của bạn có thể khởi chạy một quy trình đăng nhập tương tác:private void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
Trong lệnh gọi lại
onActivityResult()
, hãy xử lý kết quả từ ý định được trả về.- Nếu kết quả đăng nhập thành công, hãy lấy đối tượng
GoogleSignInAccount
từGoogleSignInResult
. - Nếu kết quả đăng nhập không thành công, bạn nên xử lý lỗi đăng nhập (ví dụ: bằng cách hiển thị thông báo lỗi trong một cảnh báo). Đoạn mã sau đây cho thấy cách ứng dụng của bạn có thể xử lý kết quả đăng nhập của người chơi:
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == RC_SIGN_IN) { GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data); if (result.isSuccess()) { // The signed in account is stored in the result. GoogleSignInAccount signedInAccount = result.getSignInAccount(); } else { String message = result.getStatus().getStatusMessage(); if (message == null || message.isEmpty()) { message = getString(R.string.signin_other_error); } new AlertDialog.Builder(this).setMessage(message) .setNeutralButton(android.R.string.ok, null).show(); } } }
- Nếu kết quả đăng nhập thành công, hãy lấy đối tượng
Truy xuất thông tin người chơi
GoogleSignInAccount
mà Google Sign-In API trả về không chứa bất kỳ thông tin nào về người chơi. Nếu trò chơi của bạn sử dụng thông tin người chơi (chẳng hạn như tên hiển thị và mã nhận dạng người chơi), bạn có thể làm theo các bước sau để truy xuất thông tin này.
- Lấy một đối tượng
PlayersClient
bằng cách gọi phương thứcgetPlayersClient()
và truyềnGoogleSignInAccount
vào dưới dạng một tham số. - Sử dụng các phương thức
PlayersClient
để tải không đồng bộ đối tượngPlayer
chứa thông tin của người chơi. Ví dụ: bạn có thể gọigetCurrentPlayer()
để tải người chơi hiện đang đăng nhập. Nếu tác vụ trả về mộtApiException
có mã trạng thái làSIGN_IN_REQUIRED
, thì điều này cho biết người chơi cần được xác thực lại. Để thực hiện việc này, hãy gọiGoogleSignInClient.getSignInIntent()
để đăng nhập vào trình phát một cách tương tác. - Nếu tác vụ trả về thành công đối tượng
Player
, thì bạn có thể gọi các phương thức của đối tượngPlayer
để truy xuất thông tin chi tiết cụ thể về người chơi (ví dụ:getDisplayName()
hoặcgetPlayerId()
.
Cung cấp nút đăng nhập
Để cung cấp một nút đăng nhập bằng Google tiêu chuẩn trong trò chơi, bạn có thể sử dụng một trong những phương pháp sau:
- Thêm một
com.google.android.gms.common.SignInButton
vào bố cục hoạt động chính; hoặc - Thiết kế một nút đăng nhập tuỳ chỉnh theo Nguyên tắc sử dụng thương hiệu khi Đăng nhập bằng Google.
Khi người dùng nhấp vào nút đăng nhập, trò chơi của bạn sẽ bắt đầu quy trình đăng nhập bằng cách gửi một ý định đăng nhập, như mô tả trong phần Thực hiện quy trình đăng nhập tương tác.
Đoạn mã này cho biết cách bạn có thể thêm một nút đăng nhập trong phương thức onCreate()
cho hoạt động của mình.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_sign_in); findViewById(R.id.sign_in_button).setOnClickListener(this); findViewById(R.id.sign_out_button).setOnClickListener(this); }
Đoạn mã sau đây cho biết cách bạn có thể gửi ý định đăng nhập khi người dùng nhấp vào nút đăng nhập.
@Override public void onClick(View view) { if (view.getId() == R.id.sign_in_button) { // start the asynchronous sign in flow startSignInIntent(); } else if (view.getId() == R.id.sign_out_button) { // sign out. signOut(); // show sign-in button, hide the sign-out button findViewById(R.id.sign_in_button).setVisibility(View.VISIBLE); findViewById(R.id.sign_out_button).setVisibility(View.GONE); } }
Hiển thị cửa sổ bật lên trong trò chơi
Bạn có thể hiển thị các khung hiển thị bật lên trong trò chơi bằng cách sử dụng lớp GamesClient
. Ví dụ: trò chơi của bạn có thể hiển thị cửa sổ bật lên "Chào mừng bạn quay trở lại" hoặc "Thành tích đã mở khoá". Để cho phép Dịch vụ trò chơi của Google Play khởi chạy cửa sổ bật lên trong các khung hiển thị trong trò chơi, hãy gọi phương thức setViewForPopups()
. Bạn có thể tuỳ chỉnh thêm vị trí xuất hiện của cửa sổ bật lên trên màn hình bằng cách gọi setGravityForPopups()
.
Đăng xuất người chơi
Bạn có thể đăng xuất bằng cách gọi phương thức signOut()
trên GoogleSignInClient
.
private void signOut() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); signInClient.signOut().addOnCompleteListener(this, new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { // at this point, the user is signed out. } }); }