ลงชื่อเข้าใช้เกม Android

หลังจากเลิกใช้งาน API ของ Google Sign-In แล้ว เราจะนำ SDK v1 ของเกมออกในปี 2026 หลังจากเดือนกุมภาพันธ์ 2025 คุณจะเผยแพร่ เกมที่เพิ่งผสานรวมกับ SDK v1 ของ Games ใน Google Play ไม่ได้ เราขอแนะนำให้ใช้ SDK v2 ของ Games แทน
แม้ว่าเกมที่มีอยู่ซึ่งผสานรวมกับเกมเวอร์ชัน 1 ก่อนหน้าจะยังคงทำงานได้อีก 2-3 ปี แต่เราขอแนะนำให้คุณย้ายข้อมูลไปยัง v2 ตั้งแต่เดือนมิถุนายน 2025 เป็นต้นไป
คู่มือนี้มีไว้สำหรับการใช้ SDK บริการเกมของ Play เวอร์ชัน 1 ดูข้อมูล เกี่ยวกับ SDK เวอร์ชันล่าสุดได้ที่ เอกสารประกอบ v2

หากต้องการเข้าถึงฟังก์ชันการทำงานของบริการ Google Play Games เกมของคุณจะต้องระบุบัญชีของผู้เล่นที่ลงชื่อเข้าใช้ หากผู้เล่นไม่ได้รับการตรวจสอบสิทธิ์ เกมของคุณอาจพบข้อผิดพลาด เมื่อเรียกใช้ Google Play Games Services API เอกสารนี้อธิบายวิธี ใช้ประสบการณ์การลงชื่อเข้าใช้ที่ราบรื่นในเกม

ใช้การลงชื่อเข้าใช้ของผู้เล่น

คลาส GoogleSignInClient เป็นจุดแรกเข้าหลักในการดึงข้อมูลบัญชีของผู้เล่นที่ลงชื่อเข้าใช้ในปัจจุบัน และลงชื่อเข้าใช้ผู้เล่นหากผู้เล่นยังไม่ได้ลงชื่อเข้าใช้แอปของคุณใน อุปกรณ์

หากต้องการสร้างไคลเอ็นต์การลงชื่อเข้าใช้ ให้ทำตามขั้นตอนต่อไปนี้

  1. สร้างไคลเอ็นต์การลงชื่อเข้าใช้ผ่านออบเจ็กต์ GoogleSignInOptions ดังที่แสดงในข้อมูลโค้ดต่อไปนี้ ใน GoogleSignInOptions.Builder หากต้องการกำหนดค่าการลงชื่อเข้าใช้ คุณต้องระบุ GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN

    GoogleSignInOptions signInOptions = GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN;
  2. หากต้องการใช้ SnapshotsClient ให้เพิ่ม .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS) ลงใน GoogleSignInOptions.Builder ตามที่แสดงในข้อมูลโค้ดต่อไปนี้

    GoogleSignInOptions  signInOptions =
        new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN)
            .requestScopes(Games.SCOPE_GAMES_SNAPSHOTS)
            .build();
  3. เรียกใช้เมธอด 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() ของกิจกรรม

หากต้องการลงชื่อเข้าใช้แบบเงียบ ให้ทำตามขั้นตอนต่อไปนี้

  1. เรียกใช้เมธอด silentSignIn() ใน GoogleSignInClient เพื่อเริ่มขั้นตอนการลงชื่อเข้าใช้แบบเงียบ การเรียกนี้จะแสดงออบเจ็กต์ Task<GoogleSignInAccount> ซึ่งมี GoogleSignInAccount หากการลงชื่อเข้าใช้แบบเงียบสำเร็จ
  2. จัดการการลงชื่อเข้าใช้เพลเยอร์ที่สำเร็จหรือล้มเหลวโดยการแทนที่ 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 หรือการแสดงข้อความแจ้งขอความยินยอมในนามของแอป ระบบจะแสดงผลลัพธ์ผ่านการเรียกกลับ onActivityResult

หากต้องการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ ให้ทำตามขั้นตอนต่อไปนี้

  1. โทรหา getSigninIntent() ใน GoogleSignInClient เพื่อรับความตั้งใจในการลงชื่อเข้าใช้ จากนั้นโทรหา startActivity() และส่งความตั้งใจนั้น ข้อมูลโค้ดต่อไปนี้แสดงวิธีที่แอปของคุณสามารถ เปิดตัวขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ

    private void startSignInIntent() {
      GoogleSignInClient signInClient = GoogleSignIn.getClient(this,
          GoogleSignInOptions.DEFAULT_GAMES_SIGN_IN);
      Intent intent = signInClient.getSignInIntent();
      startActivityForResult(intent, RC_SIGN_IN);
    }
  2. ใน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 แสดงผลจะไม่มีข้อมูลผู้เล่น หากเกมใช้ข้อมูลผู้เล่น เช่น ชื่อที่แสดงของผู้เล่นและรหัสผู้เล่น คุณสามารถทำตามขั้นตอนต่อไปนี้เพื่อดึงข้อมูลนี้

  1. รับออบเจ็กต์ PlayersClient โดยเรียกใช้เมธอด getPlayersClient() และส่ง GoogleSignInAccount เป็นพารามิเตอร์
  2. ใช้วิธีการ PlayersClient เพื่อโหลดออบเจ็กต์ Player ที่มีข้อมูลของผู้เล่นแบบไม่พร้อมกัน เช่น คุณสามารถเรียกใช้ getCurrentPlayer() เพื่อโหลดผู้เล่นที่ลงชื่อเข้าใช้ในปัจจุบัน หากงานส่งคืน ApiException ที่มีรหัสสถานะ เป็น SIGN_IN_REQUIRED แสดงว่าต้องมีการตรวจสอบสิทธิ์ผู้เล่นอีกครั้ง โดยเรียกใช้ GoogleSignInClient.getSignInIntent() เพื่อลงชื่อเข้าใช้เพลเยอร์แบบอินเทอร์แอกทีฟ
  3. หากงานแสดงผลออบเจ็กต์ Player สำเร็จ คุณจะเรียกใช้เมธอดของออบเจ็กต์ Player เพื่อดึงรายละเอียดผู้เล่นที่เฉพาะเจาะจงได้ (เช่น getDisplayName() หรือ getPlayerId()

ระบุปุ่มลงชื่อเข้าใช้

หากต้องการแสดงปุ่มลงชื่อเข้าใช้ด้วยบัญชี Google มาตรฐานในเกม คุณสามารถใช้วิธีใดวิธีหนึ่งต่อไปนี้

เมื่อผู้ใช้คลิกปุ่มลงชื่อเข้าใช้ เกมของคุณควรเริ่มขั้นตอนการลงชื่อเข้าใช้โดยการส่ง 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);
}

ข้อมูลโค้ดต่อไปนี้แสดงวิธีส่ง Intent การลงชื่อเข้าใช้เมื่อผู้ใช้คลิกปุ่ม ลงชื่อเข้าใช้

@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.
        }
      });
}