Để 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 của người chơi đã đăng nhập. Nếu người chơi không đượ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 quy trình đă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
trình phát đã đăng nhập và đăng nhập trình phát nếu trước đây họ chưa thực hiện thao tác như vậy trên ứng dụng của bạn trong
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 qua
GoogleSignInOptions
như minh hoạ trong đoạn mã sau đây. 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 một
SnapshotsClient
! sau đó 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()
rồi truyền vào các tuỳ chọn mà bạn đã thiết lập ở các bước trước. Nếu cuộc gọi là thành công, API Đăng nhập bằng Google 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 đã được đăng nhập hay chưa
trên thiết bị bạn đang dùng GoogleSignIn.getLastSignedInAccount()
và liệu 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, nghĩa là getLastSignedInAccount()
sẽ trả về một
giá trị không rỗng và hasPermissions()
trả về true
. Bạn có thể yên tâm sử dụng
tài khoản được trả về từ getLastSignedInAccount()
, ngay cả khi thiết bị
ngoại tuyến.
Đăng nhập thầm lặng
Bạn có thể gọi lệnh silentSignIn()
để truy xuất tài khoản của người chơi hiện đã đăng nhập,
và cố gắng đăng nhập người chơi mà không hiển thị giao diện người dùng (nếu họ có
đã đă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 đó cho tài khoản đăng nhập mà nhiệm vụ
trả về kết quả hoặc null
, cho biết không có người dùng đã đăng nhập.
Nếu nỗ lực đăng nhập thầm lặng không thành công, 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ư được mô tả trong Thực hiện đăng nhập tương tác.
Do trạng thái của người chơi đã đăng nhập có thể thay đổi khi hoạt động không chạy ở nền trước, nên chúng ta
nên gọi silentSignIn()
từ
onResume()
.
Để tự động thực hiện quy trình đăng nhập, 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 trong nền. Lệnh gọi này trả về một đối tượngTask<GoogleSignInAccount>
chứaGoogleSignInAccount
nếu đăng nhập thầm lặng thành công. - Xử lý trạng thái đăng nhập của người chơi không thành công bằng cách ghi đè
OnCompleteListener
.- Nếu đăng nhập thành công, hãy tải
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 để bắt đầu một quy trình đăng nhập có tính tương tác.
Để biết danh sách các trình nghe gọi lại khác mà bạn có thể sử dụng, hãy xem
Hướng dẫn cho nhà phát triển API Tasks
và
Task
Tài liệu tham khảo API.
- Nếu đăng nhập thành công, hãy tải
Đoạn mã sau đây cho biết cách ứng dụng của bạn có thể thực hiện đă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 nỗ lực đăng nhập trong chế độ im lặng không thành công, bạn có thể gọi
getException()
đến
nhận một ApiException
kèm theo mã trạng thái chi tiết. Mã trạng thái của 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 phải
bắt đầu một quy trình đăng nhập có tính tương tác như mô tả trong phần tiếp theo.
Thực hiện đăng nhập có tính tương tác
Để đăng nhập bằng hoạt động tương tác của 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 hiển thị giao diện người dùng nhắc người chơi nhập thông tin đăng nhập của họ
để đă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, vì hoạt động đăng nhập sẽ xử lý
các tình huống như cần cập nhật Dịch vụ Google Play hoặc hiện lời nhắc về sự đồng ý trên
thay mặt cho bạn. Kết quả được trả về qua
onActivityResult
.
Để thực hiện quá trình đăng nhập theo cách tương tác, hãy làm theo các bước sau:
Gọi
getSigninIntent()
trênGoogleSignInClient
để lấy ý đị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ể bắt đầu một quy trình đăng nhập có tính 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
onActivityResult()
gọi lại, xử lý kết quả từ ý định được trả về.- Nếu kết quả đăng nhập thành công, hãy nhận
GoogleSignInAccount
quaGoogleSignInResult
. - 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 hiển thị thông báo lỗi trong cảnh báo). Đoạn mã sau đây cho biết 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 nhận
Truy xuất thông tin người chơi
GoogleSignInAccount
mà API Đăng nhập bằng Google trả về không chứa trình phát nào
của bạn. 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 đối tượng
PlayersClient
bằng cách gọi phương thứcgetPlayersClient()
rồi truyền vàoGoogleSignInAccount
làm tham số. - Sử dụng các phương thức
PlayersClient
để tải không đồng bộPlayer
đối tượng chứa thông tin của người chơi. Ví dụ: bạn có thể gọigetCurrentPlayer()
để tải trình phát hiện đang đăng nhập. Nếu tác vụ trả về mộtApiException
có mã trạng thái trong tổng sốSIGN_IN_REQUIRED
, điều này cho biết rằng 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 theo cách tương tác. - Nếu tác vụ trả về thành công đối tượng
Player
, bạn có thể gọi các phương thức của Đối tượngPlayer
để truy xuất thông tin cụ thể về người chơi (ví dụ:getDisplayName()
hoặcgetPlayerId()
.
Cung cấp nút đăng nhập
Để cung cấp nút Đăng nhập tiêu chuẩn bằng Google trong trò chơi của mình, bạn có thể sử dụng một trong các phương pháp sau:
- Bao gồm
com.google.android.gms.common.SignInButton
dựa trên bố cục chính cho hoạt động; hoặc - Thiết kế nút đăng nhập tuỳ chỉnh theo thương hiệu Đăng nhập bằng Google nguyên tắc.
Khi người dùng nhấp vào nút đăng nhập, trò chơi của bạn phải 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 đăng nhập tương tác.
Đoạn mã này cho biết cách bạn có thể thêm nút đăng nhập trong 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); } }
Đang hiện cửa sổ bật lên về trò chơi
Bạn có thể cho hiện cửa sổ bật lên trong trò chơi của mình 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 trở lại" hoặc "Đã mở khoá thành tích". Để cho phép dịch vụ trò chơi của Google Play
để mở cửa sổ bật lên trong khung hiển thị của trò chơi, hãy gọi
setViewForPopups()
. Bạn có thể tuỳ chỉnh thêm vị trí cửa sổ bật lên xuất hiện trên màn hình bằng cách gọi
setGravityForPopups()
.
Đang đăng xuất trình phát
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. } }); }