ในการเข้าถึงฟังก์ชันการทำงานของบริการเกมของ 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()
แล้วส่ง ตัวเลือกที่คุณกำหนดค่าไว้ในขั้นตอนก่อนหน้านี้ หากการโทรคือ Google Sign-In API จะแสดงอินสแตนซ์GoogleSignInClient
ตรวจสอบว่าผู้เล่นลงชื่อเข้าใช้อยู่แล้วหรือไม่
คุณตรวจสอบได้ว่าบัญชีลงชื่อเข้าใช้แล้วหรือยัง
ในอุปกรณ์ปัจจุบันโดยใช้ GoogleSignIn.getLastSignedInAccount()
และบัญชีนี้มีสิทธิ์ที่จำเป็นที่ให้ไว้ โดยใช้
GoogleSignIn.hasPermissions()
หากทั้ง 2 เงื่อนไขเป็นจริง กล่าวคือ getLastSignedInAccount()
จะแสดงผล
ค่าที่ไม่ใช่ null และ hasPermissions()
จะแสดงผล true
คุณสามารถใช้ได้อย่างปลอดภัย
บัญชีที่ถูกส่งคืนจาก getLastSignedInAccount()
แม้ว่าอุปกรณ์จะ
ออฟไลน์อยู่
กำลังลงชื่อเข้าใช้แบบเงียบ
คุณสามารถโทรหา silentSignIn()
เพื่อเรียกข้อมูลบัญชีของโปรแกรมเล่นที่ลงชื่อเข้าใช้อยู่ในขณะนี้
และให้ผู้เล่นลงชื่อเข้าใช้โดยไม่แสดงอินเทอร์เฟซผู้ใช้ หากผู้เล่น
ลงชื่อเข้าใช้แอปในอุปกรณ์เครื่องอื่นเรียบร้อยแล้ว
เมธอด silentSignIn()
แสดงผล Task<GoogleSignInAccount>
เมื่องานเสร็จสมบูรณ์แล้ว
ให้ตั้งค่าช่อง GoogleSignInAccount
ที่คุณได้ประกาศไว้ก่อนหน้าให้กับบัญชีลงชื่อเข้าใช้ที่งาน
แสดงเป็นผลลัพธ์ หรือเปลี่ยนเป็น null
แสดงว่าไม่มีผู้ใช้ที่ลงชื่อเข้าใช้
หากความพยายามในการลงชื่อเข้าใช้แบบเงียบไม่สำเร็จ คุณสามารถเลือกส่งความตั้งใจในการลงชื่อเข้าใช้เพื่อแสดง ลงชื่อเข้าใช้สำหรับผู้ใช้ ตามที่อธิบายไว้ใน การลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ
เนื่องจากสถานะของโปรแกรมเล่นที่ลงชื่อเข้าใช้อาจเปลี่ยนแปลงได้เมื่อกิจกรรมไม่ได้อยู่ในเบื้องหน้า
แนะนำให้เรียก silentSignIn()
จากกิจกรรม
onResume()
หากต้องการลงชื่อเข้าใช้อย่างเงียบๆ ให้ทำตามขั้นตอนต่อไปนี้
- เรียกใช้เมธอด
silentSignIn()
ในGoogleSignInClient
เพื่อเริ่มขั้นตอนการลงชื่อเข้าใช้แบบปิดเสียง การเรียกนี้จะส่งคืนออบเจ็กต์Task<GoogleSignInAccount>
ซึ่งมีGoogleSignInAccount
หาก การลงชื่อเข้าใช้แบบปิดเสียงสำเร็จ - จัดการความสำเร็จหรือความล้มเหลวในการลงชื่อเข้าใช้โปรแกรมเล่นด้วยการลบล้าง
OnCompleteListener
- หากงานลงชื่อเข้าใช้สำเร็จ ให้ใช้
GoogleSignInAccount
โดยการเรียกgetResult()
- หากลงชื่อเข้าใช้ไม่สำเร็จ คุณสามารถส่งความตั้งใจในการลงชื่อเข้าใช้เพื่อเปิดขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟได้
สำหรับรายการ Listener ของ Callback เพิ่มเติมที่คุณสามารถใช้ได้ โปรดดูที่
คู่มือนักพัฒนาซอฟต์แวร์ 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 หรือแสดงข้อความแจ้งขอความยินยอมในแอป
แทน ผลลัพธ์จะถูกส่งคืนผ่านทาง
onActivityResult
Callback
หากต้องการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ โปรดทำตามขั้นตอนต่อไปนี้
โทรติดต่อ
getSigninIntent()
ที่หมายเลขGoogleSignInClient
เพื่อรับ Intent ในการลงชื่อเข้าใช้ จากนั้นให้โทรstartActivity()
และส่งต่อเจตนานั้น ข้อมูลโค้ดต่อไปนี้จะแสดงวิธีที่แอปสามารถ เปิดขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟprivate void startSignInIntent() { GoogleSignInClient signInClient = GoogleSignIn.getClient(this, GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN); Intent intent = signInClient.getSignInIntent(); startActivityForResult(intent, RC_SIGN_IN); }
ใน
onActivityResult()
Callback จัดการผลลัพธ์จาก 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 มาตรฐานในเกม คุณสามารถใช้ปุ่มใดปุ่มหนึ่ง วิธีการต่อไปนี้
- ใส่
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
เพื่อเปิดป๊อปอัปในมุมมองในเกม ให้เรียก
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. } }); }