เกมของคุณต้องระบุบัญชีของผู้เล่นที่ลงชื่อเข้าใช้เพื่อเข้าถึงฟังก์ชันบริการเกมของ Google Play หากผู้เล่นไม่ได้รับการตรวจสอบสิทธิ์ เกมของคุณอาจพบข้อผิดพลาดเมื่อเรียกใช้ API บริการเกมของ Google Play เอกสารประกอบนี้จะอธิบายวิธีใช้ประสบการณ์การลงชื่อเข้าใช้อย่างราบรื่นในเกม
การใช้การลงชื่อเข้าใช้โปรแกรมเล่น
คลาส 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()
แล้วส่งผ่านตัวเลือกที่กําหนดค่าไว้ในขั้นตอนก่อนหน้า หากการโทรสําเร็จ API การลงชื่อเข้าใช้ของ Google จะแสดงอินสแตนซ์ของGoogleSignInClient
ตรวจสอบว่าผู้เล่นลงชื่อเข้าใช้แล้วหรือยัง
คุณตรวจสอบได้ว่ามีการลงชื่อเข้าใช้บัญชีในอุปกรณ์ปัจจุบันแล้วหรือไม่โดยใช้ GoogleSignIn.getLastSignedInAccount()
และตรวจสอบว่าบัญชีนี้มีสิทธิ์ที่จําเป็นแล้วหรือไม่โดยใช้ GoogleSignIn.hasPermissions()
หากทั้ง 2 เงื่อนไขเป็นจริง กล่าวคือ getLastSignedInAccount()
แสดงผลค่าที่ไม่เป็นค่าว่าง และ hasPermissions()
แสดงผล true
คุณจะใช้บัญชีที่แสดงผลจาก getLastSignedInAccount()
ได้อย่างปลอดภัยแม้ว่าอุปกรณ์จะออฟไลน์อยู่
ดําเนินการลงชื่อเข้าใช้แบบเงียบ
คุณเรียก silentSignIn()
เพื่อดึงข้อมูลบัญชีของผู้เล่นที่ลงชื่อเข้าใช้อยู่ได้ แล้วลองลงชื่อเข้าใช้ด้วยโปรแกรมเล่นโดยไม่ต้องแสดงอินเทอร์เฟซผู้ใช้หากผู้ใช้เหล่านั้นลงชื่อเข้าใช้แอปของคุณในอุปกรณ์เครื่องอื่นได้สําเร็จ
เมธอด silentSignIn()
จะแสดงผล Task<GoogleSignInAccount>
เมื่องานเสร็จสมบูรณ์ คุณจะต้องตั้งค่าช่อง GoogleSignInAccount
ที่ประกาศไว้ก่อนหน้านี้ในบัญชีลงชื่อเข้าใช้ว่างานจะแสดงผลเป็นผลการค้นหา หรือตั้งค่าเป็น null
ซึ่งระบุว่าไม่มีผู้ใช้ที่ลงชื่อเข้าใช้
หากพยายามลงชื่อเข้าใช้ไม่สําเร็จ คุณอาจเลือกส่งความตั้งใจในการลงชื่อเข้าใช้เพื่อแสดงอินเทอร์เฟซการลงชื่อเข้าใช้ของผู้ใช้ได้ตามที่อธิบายไว้ในการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
เนื่องจากสถานะของโปรแกรมเล่นที่ลงชื่อเข้าใช้อาจเปลี่ยนแปลงเมื่อกิจกรรมไม่ได้อยู่เบื้องหน้า เราจึงแนะนําให้เรียก silentSignIn()
จากเมธอดของ onResume()
ของกิจกรรม
หากต้องการลงชื่อเข้าใช้โดยไม่ใช้เสียง ให้ทําตามขั้นตอนต่อไปนี้
- เรียกเมธอด
silentSignIn()
ในGoogleSignInClient
เพื่อเริ่มขั้นตอนการลงชื่อเข้าใช้แบบเงียบ การเรียกนี้จะแสดงออบเจ็กต์Task<GoogleSignInAccount>
ที่มีGoogleSignInAccount
หากการลงชื่อเข้าใช้แบบปิดเสียงสําเร็จ - จัดการความสําเร็จหรือความล้มเหลวในการลงชื่อเข้าใช้ของผู้เล่นด้วยการลบล้าง
OnCompleteListener
- หากงานลงชื่อเข้าใช้สําเร็จ โปรดรับออบเจ็กต์
GoogleSignInAccount
โดยการเรียกใช้getResult()
- หากลงชื่อเข้าใช้ไม่สําเร็จ คุณสามารถส่งความตั้งใจในการลงชื่อเข้าใช้เพื่อเปิดใช้ขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
สําหรับรายการ Listener การโทรกลับเพิ่มเติมที่คุณใช้ได้ โปรดดูคู่มือนักพัฒนาซอฟต์แวร์ API ของ Tasks และการอ้างอิง API
Task
- หากงานลงชื่อเข้าใช้สําเร็จ โปรดรับออบเจ็กต์
ข้อมูลโค้ดต่อไปนี้แสดงให้เห็นประสิทธิภาพของแอปในการลงชื่อเข้าใช้
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 หรือแสดงข้อความแจ้งความยินยอมในนามของแอป ระบบจะแสดงผลการค้นหาผ่านการติดต่อกลับของ 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); }
ในการเรียกกลับ
onActivityResult()
ให้จัดการผลลัพธ์จาก Intent ที่แสดงผล- หากผลการลงชื่อเข้าใช้สําเร็จ โปรดรับออบเจ็กต์
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 Sign-In มาตรฐานในเกม ให้ใช้วิธีใดวิธีหนึ่งต่อไปนี้
- รวม
com.google.android.gms.common.SignInButton
ไว้ในเลย์เอาต์กิจกรรมหลัก หรือ - ออกแบบปุ่มลงชื่อเข้าใช้แบบกําหนดเองตามหลักเกณฑ์การสร้างแบรนด์ของ Google Sign-In
เมื่อผู้ใช้คลิกปุ่มลงชื่อเข้าใช้ เกมของคุณควรเริ่มขั้นตอนการลงชื่อเข้าใช้ด้วยการส่ง Intent การลงชื่อเข้าใช้ตามที่อธิบายไว้ในการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
ข้อมูลโค้ดนี้แสดงวิธีเพิ่มปุ่มลงชื่อเข้าใช้ในเมธอด 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 เผยแพร่ป๊อปอัปในเกมของคุณ ให้เรียกใช้เมธอด 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. } }); }