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

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

การใช้การลงชื่อเข้าใช้โปรแกรมเล่น

คลาส 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()
    • หากลงชื่อเข้าใช้ไม่สำเร็จ คุณสามารถส่งความตั้งใจในการลงชื่อเข้าใช้เพื่อเปิดขั้นตอนการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟได้ สำหรับรายการ 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

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

  1. โทรติดต่อ 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);
    }
  2. ใน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 แสดงไม่มีโปรแกรมเล่น หากเกมของคุณใช้ข้อมูลผู้เล่น เช่น ชื่อที่แสดงและรหัสผู้เล่น คุณสามารถทำตามขั้นตอนเหล่านี้เพื่อดึงข้อมูลนี้ได้

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

การแสดงปุ่มลงชื่อเข้าใช้

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

เมื่อผู้ใช้คลิกปุ่มลงชื่อเข้าใช้ เกมของคุณควรเริ่มต้นขั้นตอนการลงชื่อเข้าใช้โดยการส่ง ความตั้งใจในการลงชื่อเข้าใช้ ตามที่อธิบายไว้ในการลงชื่อเข้าใช้แบบอินเทอร์แอกทีฟ

ข้อมูลโค้ดนี้จะแสดงวิธีเพิ่มปุ่มลงชื่อเข้าใช้ใน 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.
        }
      });
}