ดึงข้อมูลเข้าสู่ระบบที่จัดเก็บไว้ของผู้ใช้

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

ก่อนเริ่มต้น

กำหนดค่าโปรเจ็กต์ Android Studio

สร้างออบเจ็กต์ CredentialsClient

หากต้องการขอข้อมูลเข้าสู่ระบบที่จัดเก็บไว้ คุณต้องสร้างอินสแตนซ์ของ CredentialsClient เพื่อเข้าถึง Credentials API โดยทำดังนี้

CredentialsClient mCredentialsClient;

// ...

mCredentialsApiClient = Credentials.getClient(this);

สร้างออบเจ็กต์ CredentialRequest

ออบเจ็กต์ CredentialRequest ระบุระบบการลงชื่อเข้าใช้ที่คุณต้องการขอข้อมูลเข้าสู่ระบบ สร้าง CredentialRequest โดยใช้เมธอด setPasswordLoginSupported สำหรับการลงชื่อเข้าใช้ด้วยรหัสผ่าน และเมธอด setAccountTypes() สำหรับบริการลงชื่อเข้าใช้แบบรวมศูนย์ เช่น Google Sign-In

mCredentialRequest = new CredentialRequest.Builder()
    .setPasswordLoginSupported(true)
    .setAccountTypes(IdentityProviders.GOOGLE, IdentityProviders.TWITTER)
    .build();

ใช้ค่าคงที่ที่กำหนดไว้ใน IdentityProviders เพื่อระบุผู้ให้บริการการลงชื่อเข้าใช้ที่ใช้กันทั่วไป สำหรับผู้ให้บริการการลงชื่อเข้าใช้รายอื่นๆ ใช้สตริง ที่ระบุผู้ให้บริการที่ไม่ซ้ำกัน คุณต้องใช้ตัวระบุผู้ให้บริการเดียวกัน เพื่อเก็บข้อมูลเข้าสู่ระบบที่คุณใช้เพื่อเรียกข้อมูลเข้าสู่ระบบ

ขอข้อมูลเข้าสู่ระบบที่จัดเก็บไว้

หลังจากสร้างออบเจ็กต์ CredentialsClient และ CredentialRequest แล้ว ให้ส่งออบเจ็กต์คำขอไปยังเมธอด CredentialsClient.request() เพื่อขอข้อมูลเข้าสู่ระบบที่จัดเก็บไว้สำหรับแอปของคุณ

  mCredentialsClient.request(mCredentialRequest).addOnCompleteListener(
      new OnCompleteListener<CredentialRequestResponse>() {
          @Override
          public void onComplete(@NonNull Task<CredentialRequestResponse> task) {

              if (task.isSuccessful()) {
                  // See "Handle successful credential requests"
                  onCredentialRetrieved(task.getResult().getCredential());
                  return;
              }

              // See "Handle unsuccessful and incomplete credential requests"
              // ...
          }
      });

กำหนดโค้ดเรียกกลับเพื่อจัดการคำขอที่สำเร็จและล้มเหลวโดยใช้เมธอด addOnCompleteListener()

จัดการคำขอข้อมูลเข้าสู่ระบบที่สำเร็จ

ข้อความโทสต์ระบุว่าลงชื่อเข้าใช้สำเร็จ เมื่อส่งคำขอข้อมูลเข้าสู่ระบบสำเร็จ ให้ใช้ออบเจ็กต์ Credential ที่ได้เพื่อลงชื่อเข้าใช้แอปของผู้ใช้ให้เสร็จสมบูรณ์ โดยใช้เมธอด getAccountType() เพื่อระบุประเภทของข้อมูลเข้าสู่ระบบที่ดึงมา จากนั้นดำเนินการตามขั้นตอนการลงชื่อเข้าใช้ที่เหมาะสมให้เสร็จสิ้น เช่น สำหรับ Google Sign-In ให้สร้างออบเจ็กต์ GoogleSignInClient ที่มีรหัสผู้ใช้ จากนั้นใช้ออบเจ็กต์เพื่อเริ่มขั้นตอนการลงชื่อเข้าใช้ สำหรับการลงชื่อเข้าใช้ด้วยรหัสผ่าน ให้ใช้ ID และรหัสผ่านของผู้ใช้จากออบเจ็กต์ข้อมูลเข้าสู่ระบบเพื่อทำตามขั้นตอนการลงชื่อเข้าใช้ของแอปให้เสร็จสมบูรณ์

private void onCredentialRetrieved(Credential credential) {
    String accountType = credential.getAccountType();
    if (accountType == null) {
        // Sign the user in with information from the Credential.
        signInWithPassword(credential.getId(), credential.getPassword());
    } else if (accountType.equals(IdentityProviders.GOOGLE)) {
        // The user has previously signed in with Google Sign-In. Silently
        // sign in the user with the same ID.
        // See https://developers.google.com/identity/sign-in/android/
        GoogleSignInOptions gso =
                new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                        .requestEmail()
                        .build();

        GoogleSignInClient signInClient = GoogleSignIn.getClient(this, gso);
        Task<GoogleSignInAccount> task = signInClient.silentSignIn();
        // ...
    }
}

จัดการข้อมูลเข้าสู่ระบบที่บันทึกไว้หลายรายการ

ตัวเลือกบัญชี Smart Lock

เมื่อผู้ใช้ต้องป้อนข้อมูลเพื่อเลือกข้อมูลเข้าสู่ระบบ งาน request() จะไม่สำเร็จโดยมี ResolvableApiException ตรวจสอบว่า getStatusCode() แสดงผล RESOLUTION_REQUIRED และเรียกเมธอด startResolutionForResult() ของข้อยกเว้นเพื่อแจ้งให้ผู้ใช้เลือกบัญชี จากนั้น ดึงข้อมูลเข้าสู่ระบบที่ผู้ใช้เลือกจากเมธอด onActivityResult() ของกิจกรรม โดยส่งผ่าน Credential.EXTRA_KEY ไปยังเมธอด getParcelableExtra()

mCredentialsClient.request(request).addOnCompleteListener(
        new OnCompleteListener() {
            @Override
            public void onComplete(@NonNull Task task) {
                if (task.isSuccessful()) {
                    // ...
                    return;
                }

                Exception e = task.getException();
                if (e instanceof ResolvableApiException) {
                    // This is most likely the case where the user has multiple saved
                    // credentials and needs to pick one. This requires showing UI to
                    // resolve the read request.
                    ResolvableApiException rae = (ResolvableApiException) e;
                    resolveResult(rae, RC_READ);
                } else if (e instanceof ApiException) {
                    // The user must create an account or sign in manually.
                    Log.e(TAG, "Unsuccessful credential request.", e);

                    ApiException ae = (ApiException) e;
                    int code = ae.getStatusCode();
                    // ...
                }
            }
        });
private void resolveResult(ResolvableApiException rae, int requestCode) {
    try {
        rae.startResolutionForResult(MainActivity.this, requestCode);
        mIsResolving = true;
    } catch (IntentSender.SendIntentException e) {
        Log.e(TAG, "Failed to send resolution.", e);
        hideProgress();
    }
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    // ...

    if (requestCode == RC_READ) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            onCredentialRetrieved(credential);
        } else {
            Log.e(TAG, "Credential Read: NOT OK");
            Toast.makeText(this, "Credential Read Failed", Toast.LENGTH_SHORT).show();
        }
    }

    // ...

}

เมื่อไม่พบข้อมูลเข้าสู่ระบบที่จัดเก็บไว้ ผู้ใช้ต้องสร้างบัญชีหรือลงชื่อเข้าใช้ด้วยตนเอง หาก getStatusCode() แสดงผล SIGN_IN_REQUIRED คุณเลือกเร่งกระบวนการลงชื่อสมัครใช้และการลงชื่อเข้าใช้ได้โดยแจ้งให้ผู้ใช้เลือกข้อมูลการลงชื่อเข้าใช้ที่ใช้ล่าสุด เช่น อีเมลและชื่อ แล้วกรอกข้อมูลดังกล่าวลงในบางช่องของแบบฟอร์มโดยอัตโนมัติ ดูรายละเอียดได้ที่มอบคำแนะนำในการลงชื่อเข้าใช้ให้กับผู้ใช้

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