เกมของคุณต้องระบุบัญชีของผู้เล่นที่ลงชื่อเข้าใช้เพื่อเข้าถึงฟังก์ชันการทำงานของบริการ Google Play Games หากไม่ได้ตรวจสอบสิทธิ์ผู้เล่น เกมอาจพบข้อผิดพลาดเมื่อเรียกใช้ Google Play Games Services API เอกสารประกอบนี้อธิบายวิธีใช้ประสบการณ์การลงชื่อเข้าใช้ที่ราบรื่นในเกม
ใช้การลงชื่อเข้าใช้ของผู้เล่น
คลาส GoogleSignInClient
เป็นจุดแรกเข้าหลักในการดึงข้อมูลบัญชีของผู้เล่นที่ลงชื่อเข้าใช้อยู่ในปัจจุบัน และลงชื่อเข้าใช้ผู้เล่นหากยังไม่ได้ดำเนินการดังกล่าวในแอปในอุปกรณ์
หากต้องการสร้างไคลเอ็นต์การลงชื่อเข้าใช้ ให้ทำตามขั้นตอนต่อไปนี้
สร้างไคลเอ็นต์การลงชื่อเข้าใช้ผ่านออบเจ็กต์
GoogleSignInOptions
ดังที่แสดงในข้อมูลโค้ดต่อไปนี้ ในGoogleSignInOptions.Builder
คุณต้องระบุGoogleSignInOptions.DEFAULT_GAMES_SIGN_IN
เพื่อกําหนดค่าการลงชื่อเข้าใช้GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
หากต้องการใช้
SnapshotsClient
ให้เพิ่ม.requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
ลงในGoogleSignInOptions.Builder
ดังที่แสดงในข้อมูลโค้ดต่อไปนี้GoogleSignInOptions signInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN) .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) .build();
เรียกใช้เมธอด
GoogleSignIn.getClient()
และส่งตัวเลือกที่คุณกําหนดค่าไว้ในขั้นตอนก่อนหน้า หากการเรียกใช้สำเร็จ Google Sign-In API จะแสดงผลอินสแตนซ์ของGoogleSignInClient
ตรวจสอบว่าผู้ใช้ลงชื่อเข้าใช้แล้วหรือยัง
คุณสามารถตรวจสอบว่าบัญชีลงชื่อเข้าใช้อยู่ในอุปกรณ์ปัจจุบันหรือไม่โดยใช้ GoogleSignIn.getLastSignedInAccount()
และดูว่าบัญชีนี้ได้รับสิทธิ์ที่จำเป็นแล้วหรือไม่โดยใช้ GoogleSignIn.hasPermissions()
หากทั้ง 2 เงื่อนไขเป็นจริง กล่าวคือ getLastSignedInAccount()
แสดงผลค่าที่ไม่ใช่ Null และ hasPermissions()
แสดงผล true
คุณก็ใช้บัญชีที่แสดงผลจาก getLastSignedInAccount()
ได้โดยไม่ต้องกังวล แม้ว่าอุปกรณ์จะออฟไลน์อยู่ก็ตาม
ลงชื่อเข้าใช้แบบเงียบ
คุณสามารถเรียกใช้ silentSignIn()
เพื่อเรียกข้อมูลบัญชีของผู้เล่นที่ลงชื่อเข้าใช้อยู่ในปัจจุบัน และพยายามลงชื่อเข้าใช้ผู้เล่นโดยไม่ต้องแสดงอินเทอร์เฟซผู้ใช้หากผู้เล่นลงชื่อเข้าใช้แอปในอุปกรณ์เครื่องอื่นเรียบร้อยแล้ว
เมธอด silentSignIn()
จะแสดงผล Task<GoogleSignInAccount>
เมื่องานเสร็จสมบูรณ์แล้ว ให้ตั้งค่าช่อง GoogleSignInAccount
ที่คุณประกาศไว้ก่อนหน้านี้เป็นบัญชีการลงชื่อเข้าใช้ที่งานแสดงผลเป็นผลลัพธ์ หรือเป็น null
ซึ่งระบุว่าไม่มีผู้ใช้ที่ลงชื่อเข้าใช้
หากพยายามลงชื่อเข้าใช้โดยอัตโนมัติไม่สำเร็จ คุณสามารถเลือกส่ง Intent การลงชื่อเข้าใช้เพื่อแสดงอินเทอร์เฟซผู้ใช้การลงชื่อเข้าใช้ได้ ตามที่อธิบายไว้ในดำเนินการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
เนื่องจากสถานะของผู้เล่นที่ลงชื่อเข้าใช้อาจเปลี่ยนแปลงเมื่อกิจกรรมไม่ได้อยู่เบื้องหน้า เราจึงขอแนะนำให้เรียก silentSignIn()
จากเมธอด onResume()
ของกิจกรรม
หากต้องการลงชื่อเข้าใช้แบบเงียบ ให้ทำตามขั้นตอนต่อไปนี้
- เรียกใช้เมธอด
silentSignIn()
ในGoogleSignInClient
เพื่อเริ่มขั้นตอนการลงชื่อเข้าใช้แบบเงียบ การเรียกใช้นี้จะแสดงผลออบเจ็กต์Task<GoogleSignInAccount>
ซึ่งมีGoogleSignInAccount
หากการลงชื่อเข้าใช้แบบเงียบสําเร็จ - จัดการการลงชื่อเข้าใช้ของผู้เล่นที่สำเร็จหรือไม่สำเร็จโดยการลบล้าง
OnCompleteListener
- หากงานลงชื่อเข้าใช้สำเร็จ ให้รับออบเจ็กต์
GoogleSignInAccount
โดยเรียกใช้getResult()
- หากลงชื่อเข้าใช้ไม่สำเร็จ คุณสามารถส่ง Intent การลงชื่อเข้าใช้เพื่อเปิดขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
ดูรายการตัวรับฟังการเรียกกลับเพิ่มเติมที่คุณใช้ได้ที่คู่มือนักพัฒนาซอฟต์แวร์ Tasks API และเอกสารอ้างอิง
Task
API
- หากงานลงชื่อเข้าใช้สำเร็จ ให้รับออบเจ็กต์
ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่แอปของคุณจะลงชื่อเข้าใช้แบบเงียบได้
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(); }
หากพยายามลงชื่อเข้าใช้แบบเงียบไม่สำเร็จ คุณสามารถโทรไปที่ getException()
เพื่อรับ ApiException
พร้อมรหัสสถานะแบบละเอียด รหัสสถานะ CommonStatusCodes.SIGN_IN_REQUIRED
บ่งชี้ว่าผู้เล่นต้องดำเนินการอย่างชัดเจนเพื่อลงชื่อเข้าใช้ ในกรณีนี้ แอปของคุณควรเปิดใช้ขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟตามที่อธิบายไว้ในส่วนถัดไป
ลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
หากต้องการลงชื่อเข้าใช้ด้วยการโต้ตอบของผู้เล่น แอปของคุณจะต้องเปิดใช้งาน Intent การลงชื่อเข้าใช้ หากดำเนินการสำเร็จ Google Sign-In API จะแสดงอินเทอร์เฟซผู้ใช้ที่แจ้งให้ผู้เล่นป้อนข้อมูลเข้าสู่ระบบเพื่อลงชื่อเข้าใช้ แนวทางนี้ช่วยให้การพัฒนาแอปง่ายขึ้น เนื่องจากกิจกรรมการลงชื่อเข้าใช้จะจัดการสถานการณ์ต่างๆ เช่น จำเป็นต้องอัปเดตบริการ Google Play หรือแสดงข้อความแจ้งความยินยอม ในนามของแอป ระบบจะแสดงผลลัพธ์ผ่าน callback ของ onActivityResult
หากต้องการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ ให้ทำตามขั้นตอนต่อไปนี้
เรียกใช้
getSigninIntent()
ในGoogleSignInClient
เพื่อรับ Intent การลงชื่อเข้าใช้ จากนั้นเรียกใช้startActivity()
และส่ง Intent นั้น ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่แอปสามารถเปิดใช้งานขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟprivate void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
จัดการผลลัพธ์จาก Intent ที่แสดงผลในการติดต่อกลับ
onActivityResult()
- หากการลงชื่อเข้าใช้สําเร็จ ให้รับออบเจ็กต์
GoogleSignInAccount
จากGoogleSignInResult
- หากการลงชื่อเข้าใช้ไม่สำเร็จ คุณควรจัดการข้อผิดพลาดในการลงชื่อเข้าใช้ (เช่น แสดงข้อความแสดงข้อผิดพลาดในการแจ้งเตือน) ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่แอปจัดการผลลัพธ์ของการลงชื่อเข้าใช้ของผู้เล่น
@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(); } } }
- หากการลงชื่อเข้าใช้สําเร็จ ให้รับออบเจ็กต์
เรียกข้อมูลผู้เล่น
GoogleSignInAccount
ที่ Google Sign-In API แสดงผลจะไม่มีข้อมูลผู้เล่น หากเกมใช้ข้อมูลผู้เล่น เช่น ชื่อที่แสดงและรหัสผู้เล่น ให้ทำตามขั้นตอนเหล่านี้เพื่อเรียกข้อมูลนี้
- รับออบเจ็กต์
PlayersClient
โดยการเรียกใช้เมธอดgetPlayersClient()
และส่งGoogleSignInAccount
เป็นพารามิเตอร์ - ใช้เมธอด
PlayersClient
เพื่อโหลดออบเจ็กต์Player
แบบไม่พร้อมกันซึ่งมีข้อมูลของผู้เล่น เช่น คุณสามารถเรียกใช้getCurrentPlayer()
เพื่อโหลดเพลเยอร์ที่ลงชื่อเข้าใช้อยู่ในปัจจุบัน หากงานแสดงผลเป็นApiException
พร้อมรหัสสถานะSIGN_IN_REQUIRED
แสดงว่าผู้เล่นต้องได้รับการตรวจสอบสิทธิ์อีกครั้ง โดยเรียกใช้GoogleSignInClient.getSignInIntent()
เพื่อลงชื่อเข้าใช้เพลเยอร์แบบอินเทอร์แอกทีฟ - หากงานแสดงผลออบเจ็กต์
Player
สำเร็จ คุณจะเรียกใช้เมธอดของออบเจ็กต์Player
เพื่อดึงรายละเอียดผู้เล่นที่เฉพาะเจาะจงได้ (เช่นgetDisplayName()
หรือgetPlayerId()
ระบุปุ่มลงชื่อเข้าใช้
หากต้องการใส่ปุ่มลงชื่อเข้าใช้ Google มาตรฐานในเกม คุณสามารถใช้แนวทางใดแนวทางหนึ่งต่อไปนี้
- ใส่
com.google.android.gms.common.SignInButton
ในเลย์เอาต์กิจกรรมหลัก หรือ - ออกแบบปุ่มลงชื่อเข้าใช้ที่กำหนดเองตามหลักเกณฑ์การใช้แบรนด์ Google Sign-In
เมื่อผู้ใช้คลิกปุ่มลงชื่อเข้าใช้ เกมควรเริ่มขั้นตอนการลงชื่อเข้าใช้โดยส่งความตั้งใจลงชื่อเข้าใช้ ตามที่อธิบายไว้ในลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
ข้อมูลโค้ดนี้แสดงวิธีเพิ่มปุ่มลงชื่อเข้าใช้ในเมธอด onCreate()
สําหรับกิจกรรม
@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); }
ข้อมูลโค้ดต่อไปนี้แสดงวิธีส่งความตั้งใจลงชื่อเข้าใช้เมื่อผู้ใช้คลิกปุ่มลงชื่อเข้าใช้
@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); } }
แสดงป๊อปอัปเกม
คุณสามารถแสดงมุมมองแบบป๊อปอัปในเกมได้โดยใช้คลาส GamesClient
เช่น เกมอาจแสดงป๊อปอัป "ยินดีต้อนรับกลับ" หรือ "ปลดล็อกรางวัลพิเศษแล้ว" หากต้องการอนุญาตให้บริการ Google Play Games แสดงป๊อปอัปในมุมมองในเกม ให้เรียกใช้เมธอด setViewForPopups()
คุณสามารถปรับแต่งตำแหน่งที่ป๊อปอัปจะปรากฏบนหน้าจอเพิ่มเติมได้โดยเรียกใช้ setGravityForPopups()
ออกจากระบบโปรแกรมเล่น
ออกจากระบบได้ด้วยการเรียกใช้เมธอด signOut()
ใน 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. } }); }